题目写了一大堆背景。

一句话题意就是求 $q^{\sum_{d|n}C_{n}^{d}} \mod 999911659$。

因为$n$是质数,只有当$q$是$n$的倍数时(此题数据范围原因,最多$q=n$),两数不互质,无法使用一些同余方程公式。这种特殊情况下可直接观察原式,发现答案就是$0$。

下面考虑的就都是$q≠n$的倍数的情况了。

根据$φ$的性质,由于这里$n(999911659)$是个质数,所以欧拉函数$φ(n)=n-1=999911658$;且当前考虑的是$q≠n$的情况,所以$q,n$必定互质,可以用欧拉定理。

先放此题结论:$q^{\sum_{d|n}C_{n}^{d}} \mod 999911659 \equiv q^{\sum_{d|n}C_{n}^{d}\mod 999911658} (\mod 999911659\space)$

但原欧拉定理不是这样的,这里推一下吧。

原欧拉定理:$q^{φ(M)} \equiv 1 (\mod M\space)$(设模数为$M$)

由于同余满足加、减、乘运算,两边同时翻$x(x为非负整数)$次方,得

$q^{φ(M)*x} \equiv 1 (\mod M\space)$

两边再同时乘以$a^y(y为非负整数)$,得

$q^{φ(M)*x+y} \equiv q^y (\mod M\space)$

设 $k=φ(M)*x+y$,则 $q^k \equiv q^y (\mod M\space)$

由于 $y=k \mod φ(M)$。

所以 $q^k \equiv q^{k\mod φ(M)} (\mod M\space)$

由于这题的值都是正整数,所以可以用非负的$x,y$得出的$k$表示任意非负整数,即可以表示$\sum_{d|n}C_{n}^{d}$这种非负整数。

因此上述结论对 $q^{\sum_{d|n}C_{n}^{d}} \mod 999911659$ 成立。

于是本题的关键就是求 $\sum_{d|n}C_{n}^{d}\mod 999911658$ 了。

但$999911658$不是质数,没法直接套同余公式。我们需要把它分解质因数。

通过另写一个暴力程序可知把这个数分解质因数得 $999911658=2*3*4679*35617$

分解出来的质数都非常小,设其中一个为$M$,我们直接$O(\sqrt n)$地枚举$n$的约数$d$,用 $lucas$ 求组合数$C_{n}^{d}\mod M$。

求和即可解出$\sum_{d|n}C_{n}^{d}\mod M$。

然后因为四个模数都是质数,所以可以用中国剩余定理合并答案。

$x\mod 2=a_1$

$x\mod 3=a_2$

$x\mod 4769=a_3$

$x\mod 35617=a_4$

即可得到 $\sum_{d|n}C_{n}^{d}\mod 999911658$ 的最小非负整数解$x$。再用快速幂求 $q^x$ 即可得到原问题的答案。

 #include<bits/stdc++.h>
#define ll long long
using namespace std;
inline ll read(){
ll x=; bool f=; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=;
for(; isdigit(c);c=getchar()) x=(x<<)+(x<<)+(c^'');
if(f) return x;
return -x;
}
const ll a[]={,,,};
ll n,g,p[][],b[],inv[][];
ll ans,mod=;
inline ll C(ll x,ll y,ll mod){
if(x>y) return ;
return p[mod][y]*inv[mod][p[mod][y-x]*p[mod][x]%a[mod]]%a[mod];
}
ll lucas(ll x,ll y,ll mod){ //求组合数C(x,n)%a[mod]
if(x==) return ;
return C(x%a[mod],y%a[mod],mod)*lucas(x/a[mod],y/a[mod],mod);
}
void exgcd(ll a,ll b,ll &x,ll &y){
if(b==){x=,y=; return;}
exgcd(b,a%b,x,y);
ll t=x; x=y, y=t-(a/b)*y;
}
ll Pow(ll a,ll b){
ll ret=;
while(b>){
if(b&) (ret*=a)%=mod;
(a*=a)%=mod;
b>>=;
}
return ret;
}
int main(){
n=read(),g=read();
g%=mod;
if(!g){printf("0\n"); return ;}
ll i,j;
for(i=;i^;++i){
for(j=p[i][]=;j<=a[i];++j) p[i][j]=p[i][j-]*j%a[i];
}
for(i=;i^;++i){
inv[i][]=inv[i][]=;
for(j=;j^a[i];++j){
inv[i][j]=-(a[i]/j)*inv[i][a[i]%j],
inv[i][j]=(inv[i][j]%a[i]+a[i])%a[i];
//prllf("%d %d %d %d %d",a[i],j,-(a[i]/j),inv[i][a[i]%j],inv[i][j]); system("pause");
}
}
ll to=sqrt(n);
for(i=;i<=to;++i){
for(j=;j^;++j){
if(n%i==){
b[j]=(b[j]+lucas(i,n,j))%a[j];
if(i*i!=n)
b[j]=(b[j]+lucas(n/i,n,j))%a[j];
}
}
}
--mod;
ll x,y;
for(i=;i^;++i){
exgcd(mod/a[i],a[i],x,y);
x=(x%a[i]+a[i])%a[i];
ans=(ans+x*(mod/a[i])%mod*b[i])%mod;
}
++mod;
printf("%lld\n",Pow(g,ans));
return ;
}

「SDOI2010」古代猪文(bzoj1951)的更多相关文章

  1. BZOJ 1951 【SDOI2010】 古代猪文

    题目链接:古代猪文 好久没写博客了,这次就先写一篇吧…… 题面好鬼……概括起来就是:给出\(N,G(\leqslant 10^9)\),求:\[G^{\sum_{d|n}\binom{n}{d}} \ ...

  2. 【BZOJ1951】【SDOI2010】古代猪文 Lucas定理、中国剩余定理、exgcd、费马小定理

    Description “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边 ...

  3. 【BZOJ1951】【SDOI2010】古代猪文

    Background "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" --选自猪王国民歌 很久很 ...

  4. 【BZOJ1951】[SDOI2010]古代猪文

    [BZOJ1951][SDOI2010]古代猪文 题面 bzoj 洛谷 题解 题目实际上是要求 $ G^{\sum d|n\;C_n^d}\;mod \; 999911659 $ 而这个奇怪的模数实际 ...

  5. 【BZOJ1951】[Sdoi2010]古代猪文 Lucas定理+CRT

    [BZOJ1951][Sdoi2010]古代猪文 Description 求$X=\sum\limits_{d|n}C_n^d$,$Ans=G^X (\mod 999911659)$. Input 有 ...

  6. 【bzoj1951】: [Sdoi2010]古代猪文 数论-中国剩余定理-Lucas定理

    [bzoj1951]: [Sdoi2010]古代猪文 因为999911659是个素数 欧拉定理得 然后指数上中国剩余定理 然后分别lucas定理就好了 注意G==P的时候的特判 /* http://w ...

  7. 【题解】古代猪文 [SDOI2010] [BZOJ1951] [P2480]

    [题解]古代猪文 [SDOI2010] [BZOJ1951] [P2480] 在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心 ...

  8. BZOJ-1951 古代猪文 (组合数取模Lucas+中国剩余定理+拓展欧几里得+快速幂)

    数论神题了吧算是 1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1573 Solved: 650 [Submit ...

  9. 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 ...

随机推荐

  1. TFS数据库分离附加经验总结

    因TFS数据库已经100多G,所在的服务器D盘已没有空间满足tfs数据库的增长速度,故必须分离复制到其它盘.在分离过程中,先后分离了ReportServer.ReportServerTempDB.Tf ...

  2. Gradle环境下导出Swagger为PDF

    更多精彩博文,欢迎访问我的个人博客 说明 我个人是一直使用Swagger作为接口文档的说明的.但是由于在一些情况下,接口文档说明需要以文件的形式交付出去,如果再重新写一份文档难免有些麻烦.于是在网上看 ...

  3. zust_第二周——瞎扯系列

    首先来原题列表: A:Gridland http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1037 B:HangOver htt ...

  4. 删除链表的倒数第N个节点(三种方法实现)

    删除链表的倒数第N个节点 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒 ...

  5. pssh批量管理服务器

    pssh命令是一个python编写可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的,类似pdsh,个人认为相对pdsh更为简便,使用必须在各个服务器上配置好密钥认证访问. 1. ...

  6. 刚毕业去面试Python工程师,这几道题太难了,Python面试题No11

    写在前面 本想停一段时间这个系列,但是好多朋友给我发信息说让我继续整理下去,so,继续吧~ 第1题: docstring是什么? docstring是一种文档字符串,用于解释构造的作用.我们在函数.类 ...

  7. 前端Web框架的实现过程

    一.Web框架的本质: 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 半成品自定义web框架 i ...

  8. 【转】Hive over HBase和Hive over HDFS性能比较分析

    转载:http://lxw1234.com/archives/2015/04/101.htm 环境配置: hadoop-2.0.0-cdh4.3.0 (4 nodes, 24G mem/node) h ...

  9. u-boot顶层Makefile分析

    1.u-boot制作命令 make forlinx_nand_ram256_config: make all; 2.顶层mkconfig分析,参考 U-BOOT顶层目录mkconfig分析 mkcon ...

  10. poj--2139

    Description The cows have been making movies lately, so they are ready to play a variant of the famo ...