luogu P2480 [SDOI2010]古代猪文
M_sea:这道题你分析完后就是一堆板子
废话
理解完题意后,我们要求的东西是\(G^s(s=\sum_{d|n} \binom{n}{d})\)
但是这个指数\(s\)算出来非常大,,,
我们可以利用费马小定理 \(a^{(p-1)}\equiv1(mod\ p)(gcd(a,p)=1)\)
由此我们可以得到\(G^s \equiv G^{s\ mod\ (p-1)}(mod\ p)\)
组合数部分可以使用\(Lucas\)定理求解
但是,本题的\(mod-1\)不是一个质数,它可以质因数分解为\(2*3*4679*35617\)(分别记为\(p_1\ p_2\ p_3\ p_4\))
所以,我们可以对这四个质因子分别算一遍\(s\),记第\(i\)个质因子算出来的\(s\)为\(s_i\)
我们可以知道$$s\equiv s_1(mod\ p_1)$$$$s\equiv s_2(mod\ p_2)$$$$s\equiv s_3(mod\ p_3)$$$$s\equiv s_4(mod\ p_4)$$
直接上\(CRT\)(中国剩余腚♂理)即可求出\(s\)
求大佬优化常数,luogu开O2跑380ms,倒数qwq
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register
using namespace std;
const LL md=999911659;
const int _=1000000+10,N=4000000+10;
il LL rd()
{
re LL x=0,w=1;re char ch;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int n,g;
LL jc[36010][4],cj[36010][4],cc[4];
LL p[4]={2,3,4679,35617},prm[1010][2],tt;
il LL ksm(LL a,LL b,LL mod)
{
LL an=1;
while(b)
{
if(b&1) an=(an*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return an;
}
il void init()
{
for(re int j=0;j<4;j++) jc[0][j]=cj[0][j]=1;
for(re int i=1;i<=36000;i++)
for(re int j=0;j<4;j++)
jc[i][j]=(jc[i-1][j]*i)%p[j],cj[i][j]=ksm(jc[i][j],p[j]-2,p[j]);
int nn=n,sqt=sqrt(n);
for(re int i=2;i<=sqt&&nn;i++)
{
if(nn%i!=0) continue;
prm[++tt][0]=i;
while(nn%i==0) nn/=i,++prm[tt][1];
}
if(nn>1) ++prm[++tt][0]=nn,prm[tt][1]=1;
}
il LL C(int nn,int mm,int q)
{
if(nn<mm) return 0;
if(nn<p[q]) return ((jc[nn][q]*cj[mm][q])%p[q]*cj[nn-mm][q])%p[q];
return (C(nn/p[q],mm/p[q],q)*C(nn%p[q],mm%p[q],q))%p[q];
}
il void work(int o,int s) //算每个质因子的贡献
{
if(o>tt)
{
for(re int j=0;j<4;j++)
cc[j]=(cc[j]+C(n,s,j))%p[j];
return;
}
for(re int i=0;i<=prm[o][1];i++)
{
work(o+1,s);
s*=prm[o][0];
}
}
il void exgcd(LL a,LL b,LL &x,LL &y)
{
if(b==0){x=1,y=0;return;}
exgcd(b,a%b,y,x);
y-=a/b*x;
}
il LL CRT()
{
LL a,b,c,a1,b1,a2,b2,x,y;
a1=p[0],b1=cc[0];
for(re int j=1;j<4;j++)
{
a2=p[j],b2=cc[j];
a=a1,b=a2,c=b2-b1;
exgcd(a,b,x,y);
x=((x*c)%b+b)%b;
b1=b1+x*a1,a1=a1*a2;
}
return b1;
}
int main()
{
n=rd(),g=rd();
if(g==md) {putchar(48);return 0;}
init();
work(1,1);
printf("%lld\n",ksm(g,CRT(),md));
return 0;
}
luogu P2480 [SDOI2010]古代猪文的更多相关文章
- Luogu P2480 [SDOI2010]古代猪文 卢卡斯+组合+CRT
好吧刚开始以为扩展卢卡斯然后就往上套..结果奇奇怪怪又WA又T...后来才意识到它的因子都是质数...qwq怕不是这就是学知识学傻了.. 题意:$ G^{\Sigma_{d|n} \space C_n ...
- 洛咕 P2480 [SDOI2010]古代猪文
洛咕 P2480 [SDOI2010]古代猪文 题目是要求\(G^{\sum_{d|n}C^d_n}\). 用费马小定理\(G^{\sum_{d|n}C^d_n\text{mod 999911658} ...
- 洛谷 P2480 [SDOI2010]古代猪文 解题报告
P2480 [SDOI2010]古代猪文 题目背景 "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" ...
- 【题解】P2480 [SDOI2010]古代猪文 - 卢卡斯定理 - 中国剩余定理
P2480 [SDOI2010]古代猪文 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 猪王国的文明源远流长,博大精 ...
- P2480 [SDOI2010]古代猪文
P2480 [SDOI2010]古代猪文 比较综合的一题 前置:Lucas 定理,crt 求的是: \[g^x\bmod 999911659,\text{其中}x=\sum_{d\mid n}\tbi ...
- 洛谷 P2480 [SDOI2010]古代猪文 题解【欧拉定理】【CRT】【Lucas定理】
数论综合题. 题目背景 题目背景与题目无关因此省略.题目链接 题目描述 猪王国的文明源远流长,博大精深. iPig 在大肥猪学校图书馆中查阅资料,得知远古时期猪文文字总个数为 \(N\).当然,一种语 ...
- P2480 [SDOI2010]古代猪文 Lucas+CRT合并
\(\color{#0066ff}{ 题目描述 }\) 猪王国的文明源远流长,博大精深. iPig在大肥猪学校图书馆中查阅资料,得知远古时期猪文文字总个数为N.当然,一种语言如果字数很多,字典也相应会 ...
- 洛谷P2480 [SDOI2010]古代猪文
要求(图是盗来的QAQ) 首先用欧拉定理把幂模一下,直接就是MOD-1了 然后发现MOD-1可以分解为2,3,4679,35617,都是质数,可以直接用Lucas定理 然后用中国剩余定理合并一下即可 ...
- 洛谷P2480 [SDOI2010]古代猪文(费马小定理,卢卡斯定理,中国剩余定理,线性筛)
洛谷题目传送门 蒟蒻惊叹于一道小小的数论题竟能涉及这么多知识点!不过,掌握了这些知识点,拿下这道题也并非难事. 题意一行就能写下来: 给定\(N,G\),求\(G^{\sum \limits _{d| ...
随机推荐
- js簡介
js是腳本語言: js適用於服務器.pc.平板電腦.智能手機: js是最流行的編程語言,使用與html和前段: js是一種輕量級編程語言: js能被所有的現代瀏覽器執行: js和java是完全不同的編 ...
- Conjugate Function
共轭函数 共轭函数的定义: 设函数f:Rn→R,定义函数f∗:Rn→R为: f∗(y)=sup(<y,x>−f(x)) x∈D 此函数称为函数f的共轭函数.即函数yx和函数f(x)之间差 ...
- python中 Lambda,Map,Filter,Itertools,Generator高级函数的用法
Lambda 函数 Lambda 函数是一种比较小的匿名函数--匿名是指它实际上没有函数名. Python 函数通常使用 def a_function_name() 样式来定义,但对于 lambda ...
- 使用TortoiseSVN创建版本库
1. 使用TortoiseSVN创建版本库 在SVN中,为了便于创建分支和标签,我们习惯于将Repository版本库的结构布置为:/branches,/tags,/trunk.分别代表分支,标签以及 ...
- 使用嵌入式jetty实现文件服务器
pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...
- BZOJ4541 HNOI2016矿区(平面图转对偶图)
考虑先将平面图转化为对偶图.具体地,将无向边拆成两条有向边.每次考虑找到包围一个区域的所有边.对当前考虑的边,找到该边的反向边在该边终点的出边集中,按极角序排序的后继,这条后继边也是包围该区域的边.这 ...
- 睡前小dp-poj1276-多重背包+二进制优化
http://poj.org/problem?id=1276 简单的多重背包,不过需要优化一下才能过.网上还有暴力的做法. 二进制优化在背包九讲里讲的比较清楚.对于多重背包的每一件物品,使用二进制的形 ...
- $Min\_25$筛学习笔记
\(Min\_25\)筛学习笔记 这种神仙东西不写点东西一下就忘了QAQ 资料和代码出处 资料2 资料3 打死我也不承认参考了yyb的 \(Min\_25\)筛可以干嘛?下文中未特殊说明\(P\)均指 ...
- 自学Linux Shell5.2-shell内建命令history alias
点击返回 自学Linux命令行与Shell脚本之路 5.2-shell内建命令history alias 外部命令:有时称为文件系统命令,是存在于bash shell之外的程序,通常位于/bin./u ...
- 【ARC065E】??
Description 链接 Solution 问题其实就是从一个点出发,每次可以走与其曼哈顿距离恰好为一个常数\(d\)的点 显然不可能一一走完所有的边,这样复杂度下界至少是\(O(ans)\) 我 ...