【bzoj1951】[Sdoi2010]古代猪文 费马小定理+Lucas定理+中国剩余定理
题目描述
求 $g^{\sum\limits_{k|n}C_{n}^{\frac nk}}\mod 999911659$
输入
有且仅有一行:两个数N、G,用一个空格分开。
输出
有且仅有一行:一个数,表示答案除以999911659的余数。
样例输入
4 2
样例输出
2048
题解
费马小定理+Lucas定理+中国剩余定理
首先由费马小定理$a^{p-1}\equiv 1\ \ (mod\ p)$,可以将模数转化到答案的指数上,即求$\sum\limits_{k|n}C_{n}^{\frac nk}\ mod\ 999911658\ =\ \sum\limits_{k|n}C_{n}^{k}\ mod\ 999911658$。
然后直接$O(\sqrt n)$枚举一对约数中较小的那个,直接计算即可。
但这里有一个问题:减1以后模数不是质数。
于是我们需要将其进行质因子分解:$999911658=2*3*4679*35617$,然后先使用Lucas定理算出$C_n^k$在模其质因子意义下的结果,然后再使用中国剩余定理合并模线性同余方程组即可。在求解时,由于一定有解,因此不需要判定解得合法性,直接求逆元除过去即可。
时间复杂度$O(\sqrt{n}\log^2n)$
注意本题的一个巨大坑点:当$a\ mod\ p=0$时费马小定理不成立(底数模意义下为0,指数不为0但模意义下为0时会计算为1,而实际上0的正整数次幂应该为0),因此需要特判这种情况。
#include <cstdio>
#define MOD 999911658
typedef long long ll;
const int mod[] = {2 , 3 , 4679 , 35617};
ll fac[4][36000];
inline ll pow(ll x , ll y , int mod)
{
ll ans = 1;
while(y)
{
if(y & 1) ans = ans * x % mod;
x = x * x % mod , y >>= 1;
}
return ans;
}
ll calc(int n , int m , int p)
{
if(n < m) return 0;
if(n < mod[p]) return fac[p][n] * pow(fac[p][m] , mod[p] - 2 , mod[p]) * pow(fac[p][n - m] , mod[p] - 2 , mod[p]) % mod[p];
return calc(n / mod[p] , m / mod[p] , p) * calc(n % mod[p] , m % mod[p] , p) % mod[p];
}
ll C(int n , int m)
{
int i;
ll ans = 0;
for(i = 0 ; i < 4 ; i ++ )
ans = (ans + MOD / mod[i] * pow(MOD / mod[i] , mod[i] - 2 , mod[i]) % MOD * calc(n , m , i)) % MOD;
return ans;
}
int main()
{
int n , g , i , j;
ll sum = 0;
scanf("%d%d" , &n , &g) , g %= MOD + 1;
if(!g)
{
puts("0");
return 0;
}
for(i = 0 ; i < 4 ; i ++ )
{
fac[i][0] = 1;
for(j = 1 ; j < mod[i] ; j ++ ) fac[i][j] = fac[i][j - 1] * j % mod[i];
}
for(i = 1 ; i * i <= n ; i ++ )
{
if(n % i == 0)
{
sum = (sum + C(n , i)) % MOD;
if(i * i != n) sum = (sum + C(n , n / i)) % MOD;
}
}
printf("%lld\n" , pow(g , sum , MOD + 1));
return 0;
}
【bzoj1951】[Sdoi2010]古代猪文 费马小定理+Lucas定理+中国剩余定理的更多相关文章
- [bzoj1951] [Sdoi2010]古代猪文 费马小定理+Lucas定理+CRT
Description "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" --选自猪王国民歌 很久 ...
- BZOJ.1951.[SDOI2010]古代猪文(费马小定理 Lucas CRT)
题目链接 \(Description\) 给定N,G,求\[G^{\sum_{k|N}C_n^k}\mod\ 999911659\] \(Solution\) 由费马小定理,可以先对次数化简,即求\( ...
- [SDOI2010]古代猪文 (欧拉,卢卡斯,中国剩余)
[SDOI2010]古代猪文 \(solution:\) 这道题感觉综合性极强,用到了许多数论中的知识: 质因子,约数,组合数 欧拉定理 卢卡斯定理 中国剩余定理 首先我们读题,发现题目需要我们枚举k ...
- BZOJ1951:[SDOI2010]古代猪文(Lucas,CRT)
Description “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边 ...
- BZOJ1951 [Sdoi2010]古代猪文 中国剩余定理 快速幂 数论
原文链接http://www.cnblogs.com/zhouzhendong/p/8109156.html 题目传送门 - BZOJ1951 题意概括 求 GM mod 999911659 M=∑i ...
- bzoj1951 [Sdoi2010]古代猪文 ——数论综合
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1951 题意就是要求 G^( ∑(k|n) C(n,k) ) % p,用费马小定理处理指数,卢 ...
- BZOJ1951 [Sdoi2010]古代猪文 【费马小定理 + Lucas定理 + 中国剩余定理 + 逆元递推 + 扩展欧几里得】
题目 "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" --选自猪王国民歌 很久很久以前,在山的那 ...
- BZOJ1951[SDOI2010]古代猪文
Description "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" --选自猪王国民歌 很久 ...
- bzoj千题计划323:bzoj1951: [Sdoi2010]古代猪文(Lucas+CRT+欧拉定理)
https://www.lydsy.com/JudgeOnline/problem.php?id=1951 先欧拉降幂 然后模数质因数分解 分别计算组合数的结果,中国剩余定理合并 #include&l ...
随机推荐
- 【原创】面向对象作业:选课系统中用pickle储存多个对象间组合引用关系的那些坑
转载请注明出处:https://www.cnblogs.com/oceanicstar/p/9030121.html 想直接看结论先提前列出: 1.存储一个对象,文件不是真的给你存储的了对象这种东西, ...
- pywinauto 使用
Pywinauto是基于Python开发的,用于自动化测试的脚本模块,主要操作于Windows标准图形界面.它可以允许你很容易的发送鼠标.键盘动作给Windows的对话框和控件. 其中,最主要功能为 ...
- Scrapy核心组件
• 引擎(Scrapy)用来处理整个系统的数据流处理, 触发事务(框架核心) • 调度器(Scheduler)用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个UR ...
- 密码发生器 南阳acm519
密码发生器 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 在对银行账户等重要权限设置密码的时候,我们常常遇到这样的烦恼:如果为了好记用生日吧,容易被破解,不安全:如 ...
- 用ssh进行git clone出现 fatal: Could not read from remote repository.
问题:在通过MobaXterm进行ssh连接的服务器上用ssh进行git clone出现 fatal: Could not read from remote repository. 解决方法:prox ...
- web视频播放
webm.mp4/h264 video.js hevc libde265.js hls/m3u8 hls.js
- 在WPF中自定义控件(3) CustomControl (上)
原文:在WPF中自定义控件(3) CustomControl (上) 在WPF中自定义控件(3) CustomControl (上) 周银辉 ...
- 一步一步学Linq to sql(三):增删改
示例数据库 字段名 字段类型 允许空 字段说明 ID uniqueidentifier 表主键字段 UserName varchar(50) 留言用户名 PostTime datetime 留言时间 ...
- 【Keras案例学习】 多层感知机做手写字符分类(mnist_mlp )
from __future__ import print_function # 导入numpy库, numpy是一个常用的科学计算库,优化矩阵的运算 import numpy as np np.ran ...
- ios下 active 演示激活
document.body.addEventListener('touchstart', function () { });