luogu_2480: 古代猪文
洛谷:2480古代猪文
题意描述:
- 给定两个整数\(N,G\),求$G{\sum_{k|n}C_nk}\ mod\ 999911659 $。
数据范围:
- \(1\leq N\leq 10^9,1\leq G\leq 10^9\)。
思路:
- 对于这样一个式子,暴力肯定是不可能的,所以我们先来挖掘一些性质。
- 模数\(999911659\)是一个质数,我们可以想到对这个式子进行欧拉降幂。
- 我们可以得到式子:
- \(G^{\sum_{k|n}C_n^k}\equiv\ G^{\sum_{k|n}C_n^kmod\varphi(999911659)}\ mod(999911659)\)。
- 只要当我们求出来指数是多少的时候,那么此时整个结果就变得十分明了了,我们只需要快速幂一下就可以得出结果。
- 所以接下来我们的重心在于解\(\sum_{k|n}C_n^kmod\ \varphi(mod)\)。
- 对于这样一个式子,我们可以看看\(\varphi(mod)\)是多少。
- 因为\(mod=999911659\)是一个质数,那么他对应的\(\varphi(mod)=999911658\)。
- 那么我们这时候的解就变成了解\(\sum_{k|n}C_n^kmod\ \varphi(999911658)\)。
- 因为\(n\)很大,所以不管怎么算都是很不划算的,我们手里能用的工具只有\(lucas\)定理,但是\(lucas\)定理要求模数为质数,这时候我们研究一下\(999911658\)。
- 我们发现他虽然不是质数,但是对其质因数分解后,可以发现\(999911658=2*3*4679*35617\),四个质数相乘。(出题人设计的真的是太巧妙了。)
- 于是将上式改写为\(\sum_{k|n}C_n^kmod\ \varphi(2*3*4679*35617)\)。
- 到了这里,似乎就有解头了,因为我们得到了质数,同时对于组合数可以用\(lucas\)定理来求解。但接下来要怎么考虑呢。因为毕竟上式你不能拆成\(原式\%2*原式\%3,...\)。
- 于是我们可以这么考虑,首先设上式为\(x\)。
- \(x\equiv num\ mod(2*3*4679*35617)\),其中\(num\)为上式的最小正整数解。
- 对于这样一个式子,我们可以拆分成:
- \(x\equiv num\ mod(2)\)
- \(x\equiv num\ mod(3)\)
- \(x\equiv num\ mod(4679)\)
- \(x\equiv num\ mod(35617)\)
- 可以假设:
- \(num\%2=a_1\)
- \(num\%3=a_2\)
- \(num\%4679=a_3\)
- \(num\%35617=a_4\)
- 又因为\(num\)与\(x\)同余,所以有:
- \(x\%2=a_1\)
- \(x\%3=a_2\)
- \(x\%4679=a_3\)
- \(x\%35617=a_4\)
- 对于\(a_i\)可以利用\(lucas\)快速求解,对于\(x\)可以使用中国剩余定理求解。
- 假设中国剩余定理求得的结果为\(ans\),最终结果就是:
- \(G^{ans}\ mod\ 999911659\)。
注意事项:
- 可能到了这里就觉得这题能完美解决了,但是其实还有一个小的点需要我们注意,那就是虽然\(mod=999911659\)是一个质数,但是\(g\)的范围很大,有可能\(g\)是\(999911659\)的倍数,那么不互质就不可以进行常规的欧拉降幂了。
- 那这里提供两种解决方案。
- 首先可以一进来就特判一下,看看\(g\%999911659==0\)否,我们可以特判掉这种情况。
- 第二种方案可以尝试采用拓展欧拉定理,先来复习一下:
- 当\(a,n\)不互质时:
- 当\(b\geq \varphi(n)\),有\(a^b\equiv a^{b\mod\varphi(n)+\varphi(n)}\)。
- 当\(b<\varphi(n)\),有\(a^b\equiv a^{b\mod\varphi(n)}\)。
- 那这时候情况很尴尬啊,我们不知道上式的那个组合数求和有多大。
- 但是对于本题,我们可以无脑的采用第一种情况。即\(a^b\equiv a^{b\mod\varphi(n)+\varphi(n)}\)。
- 因为首先当\(b\)非常大且超过\(\varphi(n)\)时,那么式子显然成立。
- 但是当不那么大的时候,对于原式的\(mod==999911659\),其实应该采用第二种情况,但是因为\(mod\)是一个质数,根据欧拉定理\(a^{\varphi(n)}\equiv1mod(n)\),其实加上去也就相当于是乘了一个 \(1\),对结果没有影响。
- 当\(a,n\)不互质时:
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 999911659; //是一个质数
ll g, n, prime[10], a[10]; /*
999911658分解质因数结果为 2,3,4679,35617
*/ ll factor[1600], cnt;
void divide(ll x)
{
for(ll i = 1; i <= x / i; i++)
{
if(x % i == 0)
{
factor[++cnt] = i;
if(i != n / i) factor[++cnt] = n / i;
}
}
} ll qmi(ll a, ll b, ll p)
{
ll res = 1; res %= p;
while(b)
{
if(b & 1) res = res * a % p, res %= p;
a = a % p * a % p;
a %= p;
b >>= 1;
}
return res % p;
} ll C(ll a, ll b, ll p)
{
if(b > a) return 0;
if(b > a - b) b = a - b;
ll x = 1, y = 1;
for(int i = 0; i < b; i++)
{
x = x * (a - i) % p;
y = y * (i + 1) % p;
}
return x * qmi(y, p-2, p);
} ll lucas(ll a, ll b, ll p)
{
if(b == 0) return 1;
return C(a%p, b%p, p) * lucas(a/p, b/p, p) % p;
} ll exgcd(ll a, ll b, ll &x, ll &y)
{
if(b == 0) {x = 1; y = 0; return a;}
ll d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
} ll crt()
{
ll res = 0;
for(int i = 1; i <= 4; i++)
res = (res + a[i] * (mod-1)/prime[i] % (mod-1) * qmi((mod-1)/prime[i], prime[i]-2, prime[i])) % (mod-1);
return res;
} int main()
{
cin >> n >> g;
/*
if(g % mod == 0)
{
puts("0");
return 0;
}
*/
divide(n);
memset(a, 0, sizeof a);
memset(prime, 0, sizeof prime);
prime[1] = 2; prime[2] = 3;
prime[3] = 4679; prime[4] = 35617; for(int i = 1; i <= 4; i++)
{
ll tmp = 0;
for(int j = 1; j <= cnt; j++)
{
ll x = factor[j];
tmp += lucas(n, x, prime[i]) % prime[i];
tmp %= prime[i];
}
a[i] = tmp;
}
ll x = crt();
//cout << qmi(g, x, mod) << endl;
cout << qmi(g, x + mod - 1, mod) << endl;
return 0;
}
luogu_2480: 古代猪文的更多相关文章
- BZOJ-1951 古代猪文 (组合数取模Lucas+中国剩余定理+拓展欧几里得+快速幂)
数论神题了吧算是 1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1573 Solved: 650 [Submit ...
- 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] ...
- 古代猪文:数论大集合:欧拉定理,exgcd,china,逆元,Lucas定理应用
/* 古代猪文:Lucas定理+中国剩余定理 999911658=2*3*4679*35617 Lucas定理:(m,n)=(sp,tp)(r,q) %p 中国剩余定理:x=sum{si*Mi*ti} ...
- [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} ...
- BZOJ 1951 【SDOI2010】 古代猪文
题目链接:古代猪文 好久没写博客了,这次就先写一篇吧…… 题面好鬼……概括起来就是:给出\(N,G(\leqslant 10^9)\),求:\[G^{\sum_{d|n}\binom{n}{d}} \ ...
- 【BZOJ1951】[SDOI2010]古代猪文
[BZOJ1951][SDOI2010]古代猪文 题面 bzoj 洛谷 题解 题目实际上是要求 $ G^{\sum d|n\;C_n^d}\;mod \; 999911659 $ 而这个奇怪的模数实际 ...
随机推荐
- python运维开发常用模块(二)IPy
1.安装 IP地址规划是网络设计中非常重要的一个环节,规划的好坏会直 接影响路由协议算法的效率,包括网络性能.可扩展性等方面,在这个 过程当中,免不了要计算大量的IP地址,包括网段.网络掩码.广播地 ...
- 启动apache,将debug日志输出在console窗口
sudo apachectl -k start -e DEBUG 点个广告吧亲:
- wifi串口服务器
下面与大家分享上海卓岚无线wifi串口服务器ZLAN7104创建虚拟串口的设置使用心得 一.7104网线连接计算机,用ZLVircom即可搜索并配置 其中,串口设置需要匹配实际所接的串口设备,配置为相 ...
- visual studio -- 调试时自动传递给exe入参
如果你写的main函数接受入参int main(int argc, char* argv[]),则可以 右键工程--属性--调试,在命令行参数中输入入参即可,这些字符串会被直接传递给exe.
- Obloq模块:基于ESP8266的物联网模块
OBLOQ 物联网模块 OBLOQ模块是DFRobot公司开发的一款基于ESP8266芯片的物联网通信模块.模块使用串口(TTL UART)和Arduino(或者其他单片机)通信,支持MQTT,HTT ...
- Codeforces Global Round 3
Codeforces Global Round 3 A. Another One Bites The Dust 有若干个a,有若干个b,有若干个ab.你现在要把这些串拼成一个串,使得任意两个相邻的位置 ...
- 一个小巧,也很nice的“小日历”--一个Android App
一个小巧也很Nice的“小日历” 背景 因为,常用日历记一些事情,Android自带的日历,如果有事情,会显示一个小点,然后点击进去后才能看到事情的具体内容,不是很方便. 所以,写了一个“小日历” 特 ...
- StringBuilder删除最后的字符
stringbuilder碰到拼接XXx:XXX:这样的字符的时候,往往需要删除最后一个字符,通过remove(起始索引,向右移除的个数)可以实现. StringBuilder sb = new St ...
- C#使用Redis实现网站统计访问数或点赞数功能!
1.安装.net操作Redis需要的NuGet包: 这里推荐使用:StackExchange.Redis,在程序包管理器控制台输入命令install-package stackexchange.red ...
- Asp.net MVC企业级开发(02)---Log4net
Log4Net 是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件.数据库.EventLog等).日志就是程序的“黑匣子”,可以通过日志查看系统的运行过程,从而发现系统的问题. 日志的作 ...