P1951: [Sdoi2010]古代猪文
呜啊啊啊啊,选错了题,原以为很简单的优化+剪枝就能过结果牵扯到了一堆数论知识。我的错,贴上我的代码(已经尽量优化了)
- const maxn=;
- var n,g,i,j,ans:longint;
- tem:int64;
- function pow(g,x:longint):longint;
- var
- now,tem,i,t:int64;
- begin
- tem:=; now:=g;
- if g= then exit();
- while now<maxn do
- begin
- now:=now*now;
- tem:=tem*;
- end;
- now:=now mod maxn;
- if (now=) and (x div tem>=) then exit();
- if x div tem>= then t:=pow(now,x div tem)
- else t:=;
- now:=g; x:=x-tem*(x div tem);
- while x<> do
- begin
- if (x mod )= then begin
- t:=(t*now) mod maxn;
- end;
- now:=(now*now) mod maxn;
- x:=x div ;
- end;
- exit(t mod maxn);
- end;
- function c(x:longint):longint;
- var i:longint;
- tem:int64;
- begin
- tem:=g;
- for i:= to x do
- tem:=pow(tem,n-i+) mod maxn;
- for i:= to x do tem:=trunc(exp(ln(tem)/i));
- exit(tem);
- end;
- begin
- readln(n,g);
- tem:=;
- for i:= to trunc(sqrt(n)) do
- if n mod i= then
- begin
- if i*i<>n then tem:=tem*((c(i) mod maxn)*(c(n div i) mod maxn) mod maxn) mod maxn
- else tem:=(tem*c(i)) mod maxn;
- end;
- writeln(tem mod maxn);
- end.
然而正确的是。。
- #include <cstring>
- #include <iostream>
- #include <cmath>
- #include <algorithm>
- #include <cstdio>
- using namespace std;
- #define maxn 35620
- typedef long long LL;
- #define MOD 999911659
- #define M 999911658
- LL w[]={,,,};
- LL a[];
- LL fac[][maxn];
- LL Pow(LL a,LL b,LL mod)//快速幂
- {
- LL ans=;
- while(b)
- {
- if(b&) ans=(ans*a)%mod;
- a=(a*a)%mod;
- b >>= ;
- }
- return ans;
- }
- void init()//预处理阶乘
- {
- for(int i=;i<;i++)
- {
- fac[i][]=;
- for(int j=;j<=w[i];j++)
- {
- fac[i][j]=(fac[i][j-]*j)%w[i];
- }
- }
- }
- /********************************
- * 组合数取模用费马小定理
- *********************************/
- LL C(LL n,LL m,int x)//组合数取模
- {
- if(n < m) return ;
- return (fac[x][n] * Pow((fac[x][n-m]*fac[x][m]),w[x]-,w[x]))%w[x];
- }
- /*******************************
- * lucas 处理大组合数取模
- ********************************/
- LL Lucas(LL n,LL m,int x)//lucas定理
- {
- if(m==) return ;
- return (Lucas(n/w[x],m/w[x],x)*C(n%w[x],m%w[x],x))%w[x];
- }
- /****************************
- * 扩展欧几里得求乘法逆元
- *****************************/
- LL exgcd(LL a,LL b,LL &x,LL &y)//乘法逆元
- {
- if(!b){x = ;y = ;return a;}
- LL ans = exgcd(b,a%b,x,y);
- LL t = x;x = y;y = t - a/b*y;
- return ans;
- }
- /***************************************************************************************
- * 中国剩余定理:
- * x = b1 % m1
- * x = b2 % m2
- * x = b3 % m3
- * .
- * gcd(m1,m2,m3,...) = 1;
- * M = m1 * m2 * m3 *.....;
- * M1 = m2 * m3 * ...., M2 = m1 * m3 * ...., M3 = m1 * m2 * m4 *....., ......;
- * M1 * M(-1) = 1 % M ,M2 * M2(-1) = 1 % M;
- * res = (M1(-1)*b1 + M2(-1)*b2+.....)%M;res即为所求值
- * 注:如果取模的值相同:都是m1 那么 bn的值可以相加计算;
- * 略屌。。。。。。。。。。。。。。
- *
- *****************************************************************************************/
- LL CRT()//计算组合数和取模之后的值
- {
- LL i,d,x0,y0,ans=;
- for(i = ;i < ;i++)//中国剩余定理
- {
- d=M/w[i];
- exgcd(d,w[i],x0,y0);
- ans=(ans+d*x0*a[i])%M;
- }
- if(ans <= ) ans += M;
- return ans;
- }
- int main()
- {
- init();
- LL g,n;
- while(cin>>n>>g)
- {
- memset(a,,sizeof(a));
- for(int i=;i*i<=n;i++)
- {
- if(n%i==)
- {
- LL tmp=n/i;
- for(int j=;j<;j++)
- {
- if(tmp!=i) a[j]=(a[j]+Lucas(n,i,j))%w[j];
- a[j]=(a[j]+Lucas(n,tmp,j))%w[j];
- }
- }
- }
- cout<<Pow(g%MOD,CRT(),MOD)<<endl;
- }
- return ;
- }
我就不想多说了=-=
(转载请注明出处:http://www.cnblogs.com/Kalenda/)
P1951: [Sdoi2010]古代猪文的更多相关文章
- BZOJ 1951: [Sdoi2010]古代猪文( 数论 )
显然答案是G^∑C(d,N)(d|N).O(N^0.5)枚举N的约数.取模的数999911659是质数, 考虑欧拉定理a^phi(p)=1(mod p)(a与p互质), 那么a^t mod p = a ...
- 1951: [Sdoi2010]古代猪文
1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 2171 Solved: 904[Submit][Status] ...
- BZOJ 1951: [Sdoi2010]古代猪文 [Lucas定理 中国剩余定理]
1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 2194 Solved: 919[Submit][Status] ...
- [SDOI2010]古代猪文 (欧拉,卢卡斯,中国剩余)
[SDOI2010]古代猪文 \(solution:\) 这道题感觉综合性极强,用到了许多数论中的知识: 质因子,约数,组合数 欧拉定理 卢卡斯定理 中国剩余定理 首先我们读题,发现题目需要我们枚举k ...
- 洛咕 P2480 [SDOI2010]古代猪文
洛咕 P2480 [SDOI2010]古代猪文 题目是要求\(G^{\sum_{d|n}C^d_n}\). 用费马小定理\(G^{\sum_{d|n}C^d_n\text{mod 999911658} ...
- 【BZOJ1951】[SDOI2010]古代猪文
[BZOJ1951][SDOI2010]古代猪文 题面 bzoj 洛谷 题解 题目实际上是要求 $ G^{\sum d|n\;C_n^d}\;mod \; 999911659 $ 而这个奇怪的模数实际 ...
- 【BZOJ1951】[Sdoi2010]古代猪文 Lucas定理+CRT
[BZOJ1951][Sdoi2010]古代猪文 Description 求$X=\sum\limits_{d|n}C_n^d$,$Ans=G^X (\mod 999911659)$. Input 有 ...
- 洛谷 P2480 [SDOI2010]古代猪文 解题报告
P2480 [SDOI2010]古代猪文 题目背景 "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" ...
- 【bzoj1951】: [Sdoi2010]古代猪文 数论-中国剩余定理-Lucas定理
[bzoj1951]: [Sdoi2010]古代猪文 因为999911659是个素数 欧拉定理得 然后指数上中国剩余定理 然后分别lucas定理就好了 注意G==P的时候的特判 /* http://w ...
随机推荐
- 第四次java实验报告
20145306 实验四 java 开发基础 设计过程: 1.创建项目 2.选择activity_main.xml 3.显示自己的学号 4.双击改变字体大小 5.预览
- 何时使用 Em 与 Rem
原文 http://www.w3cplus.com/css/when-to-use-em-vs-rem.html 你可能已经很熟练使用这两个灵活的单位,但你可能不完全了解何时使用rem,何时使用 ...
- IIS FTP文件服务器搭建步骤
利用IIS搭建需要验证用户用的FTP服务器(当然也可以不用验证,为了安全,添加验证) 1.C盘下创建文件夹,iftppub 2.打开关闭Windows功能,Internet信息服务全选,操作完后,重启 ...
- ASP.NET 项目 App_Code下无法找到类
APP_CODE 默认情况下,VS2010中新建的WebApplication中是没有App_Code文件夹的,若需要使用,可以自己手动添加文件夹,然后将文件夹名称设置为App_Code,然后在该文件 ...
- MYSQL将表名称修改成大写的存储过程
1. 条件: 1.1 Mysql设置对大小写敏感 2. 执行下述存储过程: #call uppercase('库名') DROP PROCEDURE IF EXISTS uppercase; )) B ...
- Linux程序分析工具:ldd和nm
ldd和nm是Linux下两个非常实用的程序分析工具.其中,ldd是用来分析程序运行时需要依赖的动态链接库的工具,nm是用来查看指定程序中的符号表信息的工具. 1 ldd 格式:ldd [option ...
- ChainOfResponsibility
#include <iostream> using namespace std; class Chain { public: bool Handle() { return false; } ...
- c语言学习的第五天
#include<stdio.h> #include<stdbool.h> int main() { _Bool num=1; if (num==true); { printf ...
- paypal api 相关资料
https://developer.paypal.com/ https://developer.paypal.com/docs/classic/api/merchant/GetBalance_API_ ...
- 第十三章 调试及安全性(In .net4.5) 之 验证程序输入
1. 概述 本章介绍验证程序输入的重要性以及各种验证方法:Parse.TryParse.Convert.正则表达式.JavaScriptSerializer.XML Schemas. 2. 主要内容 ...