P2480 [SDOI2010]古代猪文

比较综合的一题

前置:Lucas 定理crt

求的是:

\[g^x\bmod 999911659,\text{其中}x=\sum_{d\mid n}\tbinom{n}{d}
\]

由于这个\(999911659\)是质数,肯定于\(g\)互质,所以由欧拉定理很容易证明:

\[a^{\varphi(p)}\equiv 1\pmod p\Rightarrow a^{k\bmod \varphi(p)}\equiv a^k\pmod p
\]

那么可以得出:

\[g^x\bmod 999911659\equiv g^{x\bmod \varphi(999911659)}\pmod {999911659}
\]

\[g^x\bmod 999911659\equiv g^{x\bmod 999911658}\pmod {999911659}
\]

所以问题转换为求:

\[\sum_{d\mid n}\tbinom{n}{d}\bmod 999911658
\]

这种大组合数的问题考虑用 Lucas,但是模数太大,且不是质数

所以考虑将它分解:\(999911658=2\times 3\times 4679\times 35617\)

那么,只需要对每一个质因数,求出\(a\equiv \sum_{d\mid n}\tbinom{n}{d}\bmod p_i\),然后再用 crt 合并就行了

算的时候,枚举每一个\(i\le \sqrt n\),如果\(i\mid n\),则计算\(\tbinom{n}{i}\)和\(\tbinom{n}{\frac{n}{i}}\)加到答案里

但是,在这种因数不能重复计算的时候,要:

for(reg int i=1;i*i<=n;i++)

而不是

for(reg int i=1;i<=std::ceil(std::sqrt(n));i++)

对于后一种,举个栗子:\(\lceil\sqrt {420}\rceil=21\),但是如果\(i\)一直枚举到\(21\),就会在\(i=20,i=21\)的时候算两次\(20,21\)这两个因数,重复了,出现错误

还有,因为每次的计算模数不同,所以要分别预处理

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<map>
#include<iomanip>
#include<cstring>
#define reg register
#define EN std::puts("")
#define LL long long
inline int read(){
register int x=0;register int y=1;
register char c=std::getchar();
while(c<'0'||c>'9'){if(c=='-') y=0;c=std::getchar();}
while(c>='0'&&c<='9'){x=x*10+(c^48);c=std::getchar();}
return y?x:-x;
}
const int prime[4]={2,3,4679,35617};
int fac[40006],inv[40005];
inline int power(int a,int b,int p){
int ret=1;
while(b){
if(b&1) ret=1ll*ret*a%p;
b>>=1;a=1ll*a*a%p;
}
return ret;
}
inline void pre(int n,int mod){
fac[0]=inv[0]=1;
for(reg int i=1;i<n;i++) fac[i]=(LL)fac[i-1]*i%mod;
inv[n-1]=power(fac[n-1],mod-2,mod);
for(reg int i=n-2;i;i--) inv[i]=(LL)inv[i+1]*(i+1)%mod;
}
inline int get_C(int n,int m,int mod){
//C(n,m)=n!/(m!*(n-m)!)
if(n<m) return 0;
return ((LL)fac[n]*inv[m]%mod)*inv[n-m]%mod;
}
inline int lucas(int n,int m,int mod){
if(n<m) return 0;
if(!n||!m) return 1;
return (LL)lucas(n/mod,m/mod,mod)*get_C(n%mod,m%mod,mod)%mod;
}
int main(){
// std::freopen("out.txt","w",stdout);
const int M=999911658;
int n=read(),g=read();
g%=(M+1);
if(!g) return std::puts("0"),0;
reg int ans=0,Mi,t;
for(reg int o=0;o<4;o++){
pre(prime[o],prime[o]);
reg int nowans=0;
for(reg int i=1;i*i<=n;i++)if(!(n%i)){
nowans=(nowans+lucas(n,i,prime[o]))%prime[o];
if(i*i!=n) nowans=((LL)nowans+lucas(n,n/i,prime[o]))%prime[o];
}
// std::printf("now ans = %d\n",nowans);
// for(reg int i=0;i<prime[o];i++) std::printf("%d %d\n",fac[i],inv[i]);
Mi=M/prime[o];
t=power(Mi,prime[o]-2,prime[o]);//t=Mi^{-1} mod prime[o]
ans=(ans+((LL)nowans*Mi%M*t%M))%M;
}
std::printf("%d",power(g,ans,M+1));
return 0;
}

P2480 [SDOI2010]古代猪文的更多相关文章

  1. 洛咕 P2480 [SDOI2010]古代猪文

    洛咕 P2480 [SDOI2010]古代猪文 题目是要求\(G^{\sum_{d|n}C^d_n}\). 用费马小定理\(G^{\sum_{d|n}C^d_n\text{mod 999911658} ...

  2. 洛谷 P2480 [SDOI2010]古代猪文 解题报告

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

  3. 【题解】P2480 [SDOI2010]古代猪文 - 卢卡斯定理 - 中国剩余定理

    P2480 [SDOI2010]古代猪文 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 猪王国的文明源远流长,博大精 ...

  4. 洛谷 P2480 [SDOI2010]古代猪文 题解【欧拉定理】【CRT】【Lucas定理】

    数论综合题. 题目背景 题目背景与题目无关因此省略.题目链接 题目描述 猪王国的文明源远流长,博大精深. iPig 在大肥猪学校图书馆中查阅资料,得知远古时期猪文文字总个数为 \(N\).当然,一种语 ...

  5. P2480 [SDOI2010]古代猪文 Lucas+CRT合并

    \(\color{#0066ff}{ 题目描述 }\) 猪王国的文明源远流长,博大精深. iPig在大肥猪学校图书馆中查阅资料,得知远古时期猪文文字总个数为N.当然,一种语言如果字数很多,字典也相应会 ...

  6. 洛谷P2480 [SDOI2010]古代猪文

    要求(图是盗来的QAQ) 首先用欧拉定理把幂模一下,直接就是MOD-1了 然后发现MOD-1可以分解为2,3,4679,35617,都是质数,可以直接用Lucas定理 然后用中国剩余定理合并一下即可 ...

  7. 洛谷P2480 [SDOI2010]古代猪文(费马小定理,卢卡斯定理,中国剩余定理,线性筛)

    洛谷题目传送门 蒟蒻惊叹于一道小小的数论题竟能涉及这么多知识点!不过,掌握了这些知识点,拿下这道题也并非难事. 题意一行就能写下来: 给定\(N,G\),求\(G^{\sum \limits _{d| ...

  8. luogu P2480 [SDOI2010]古代猪文

    M_sea:这道题你分析完后就是一堆板子 废话 理解完题意后,我们要求的东西是\(G^s(s=\sum_{d|n} \binom{n}{d})\) 但是这个指数\(s\)算出来非常大,,, 我们可以利 ...

  9. Luogu P2480 [SDOI2010]古代猪文 卢卡斯+组合+CRT

    好吧刚开始以为扩展卢卡斯然后就往上套..结果奇奇怪怪又WA又T...后来才意识到它的因子都是质数...qwq怕不是这就是学知识学傻了.. 题意:$ G^{\Sigma_{d|n} \space C_n ...

随机推荐

  1. ThinkPHP3.1.2 使用cli命令行模式运行

    ThinkPHP3.1.2 使用cli命令行模式运行 标签(空格分隔): php 前言 thinkphp3.1.2 需要使用cli方法运行脚本 折腾了一天才搞定 3.1.2的版本真的很古老 解决 增加 ...

  2. VUE_shop(第十天)项目的打包优化

    项目的打包优化 1.添加页面的加载效果 1.首先安装运行依赖nprocess,在main.js文件中的axios拦截器拦截请求的时候调用Npeocees.start. 在拦截响应的时候调用nproce ...

  3. NHibernate COUNT(*) 统计问题

    NHibernate这个框架用了有一年多了,相对有很大的优势,可以省去很多写Sql的时间. 但是如果你想用它做统计,那么有点抱歉,只能手动写写了.它内置的东西很难符合你的需求. 我遇到的问题是这样的. ...

  4. python3(二)

    # 布尔值和Java一样不做验证了 # 空值None是一个特殊的空值 # 变量 变量名必须是大小写英文.数字和_的组合,且不能用数字开头,等号=是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以 ...

  5. HBase-2.2.3源码编译-Windows版

    源码环境一览 windows: 7 64Bit Java: 1.8.0_131 Maven:3.3.9 Git:2.24.0.windows.1 HBase:2.2.3 Hadoop:2.8.5 下载 ...

  6. AJ学IOS(11)UI之图片自动轮播

    AJ分享,必须精品 先看效果 代码 #import "NYViewController.h" #define kImageCount 5 @interface NYViewCont ...

  7. PHP安全(文件包含、变量覆盖、代码执行)

    文件包含漏洞 本地文件包含 截断技巧: ../../etc/passwd%00(\x00 \0) 利用操作系统对目录最大长度的限制,可以不需要0字节而达到截断的目的.目录字符串,在windows下25 ...

  8. Bug Bash in Personal Photo Experience 1/11/2016

    In the process of our Personal Photo Experience Project, There are some bugs which hinder our forwar ...

  9. H - Tempter of the Bone DFS

    小明做了一个很久很久的梦,醒来后他竟发现自己和朋友在一个摇摇欲坠的大棋盘上,他们必须得想尽一切办法逃离这里.经过长时间的打探,小明发现,自己所在的棋盘格子上有个机关,上面写着“你只有一次机会,出发后t ...

  10. ppt和pptx转图片完整代码,解决2003版和2007版中文乱码问题

    引入所需依赖,注意poi版本,新版本不支持,最好使用和我一样的版本. <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --& ...