[Sdoi2010]古代猪文 (卢卡斯定理,欧拉函数)
哇,这道题真的好好,让我这个菜鸡充分体会到卢卡斯和欧拉函数的强大!
先把题意抽象出来!
就是计算这个东西。
p=999911659是素数,p-1=2*3*4679*35617

所以:
这样只要求出
然后再快速乘法就行了。
那好,怎么做呢?
有模运算的性质得到
然后就是卢卡斯原理。
先把卢卡斯原理放这里:
void init(int mod){ //对mod取余后,一定小于mod,因此把mod的阶乘存起来就够用
f[] = ;
for (int i = ; i <= mod; i++){
f[i] = f[i - ] * i % mod;
}
}
void ex_gcd(LL a, LL b, LL& d, LL& x, LL& y)
{
if (!b) { d = a; x = ; y = ; }
else{ ex_gcd(b, a%b, d, y, x); y -= x*(a / b); }
}
LL inv(LL a, LL m)
{
LL d, x, y;
ex_gcd(a, m, d, x, y);
return d == ? (x + m) % m : -;
}
LL Lucas(LL m, LL n, LL p){
LL res = ;
while (n && m){
LL n1 = n % p;
LL m1 = m % p;
res = res * f[n1] * inv(f[n1 - m1], p) * inv(f[m1], p) % p;
n /= p;
m /= p;
}
return (res % p + p) % p;
}

则:
那么我们其实把它每个存起来Mod[1-4]
然后,就是要找一个值来代替Mod[1-4]。利用中国剩余定理!(哇,太难打了公式了)
什么这样做?因为能同时被2,3,4679,35617那么一定会被99991165同余,那么这个数就是
注意:坑!快速幂一定要加long long,找了3小时的bug
#include<cstdio>
using namespace std;
#define ll long long
const int maxn = ;
int N, G, fact[maxn + ], mod = ;
int prime[] = { , , , , }, Mod[]; void get_fact() { fact[] = ; for (int i = ; i <= maxn; i++) fact[i] = (ll)fact[i - ] * i%mod; } int ex_t; void exgcd(int a, int b, int &x, int &y) { if (!b) { x = ; y = ; return; } exgcd(b, a%b, x, y); ex_t = x; x = y; y = ex_t - (a / b)*y; } int inv(int a, int p) { int x, y; exgcd(a, p, x, y); return (x%p + p) % p; } int calc(int i, int p) { int ret = , x, y, n, m; for (x = N, y = i; y; x /= p, y /= p) { n = x%p; m = y%p; //卢卡斯定理+预处理阶乘+逆元 ret = (ll)ret*fact[n] % p*inv(fact[m], p) % p*inv(n<m ? : fact[n - m], p) % p; } return ret; } ll pow(int x, int n)
{
int ans = ;
for (; n;n>>=, x=(ll)x*x%mod)
if (n & )ans = (ll)ans*x%mod;
return ans;
} int main()
{ scanf("%d%d", &N, &G);
if (G % (mod + ) == ){ printf(""); return ; }
get_fact(); //得到阶乘
for (int i = ; i*i <= N; ++i) //枚举因子
{
if (N%i == )
{
for (int j = ; j <= ; ++j)Mod[j] = (Mod[j] + calc(i, prime[j])) % prime[j];
if (i*i!=N)
for (int j = ; j <= ; ++j)Mod[j] = (Mod[j] + calc(N / i, prime[j])) % prime[j];
}
}
int x, y, b = ;
for (int i = ; i <= ; i++) //中国剩余定理 { exgcd(mod / prime[i], prime[i], x, y); b = (b + (ll)Mod[i] % mod*(mod / prime[i]) % mod*x%mod) % mod; }
b = (b%mod + mod) % mod; mod += ;
//printf("%d\n", b);
printf("%lld", pow(G, b));
}
[Sdoi2010]古代猪文 (卢卡斯定理,欧拉函数)的更多相关文章
- 【题解】P2480 [SDOI2010]古代猪文 - 卢卡斯定理 - 中国剩余定理
P2480 [SDOI2010]古代猪文 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 猪王国的文明源远流长,博大精 ...
- 【BZOJ1951】[Sdoi2010]古代猪文 Lucas定理+CRT
[BZOJ1951][Sdoi2010]古代猪文 Description 求$X=\sum\limits_{d|n}C_n^d$,$Ans=G^X (\mod 999911659)$. Input 有 ...
- BZOJ 1951: [Sdoi2010]古代猪文 [Lucas定理 中国剩余定理]
1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 2194 Solved: 919[Submit][Status] ...
- Luogu P2480 [SDOI2010]古代猪文 卢卡斯+组合+CRT
好吧刚开始以为扩展卢卡斯然后就往上套..结果奇奇怪怪又WA又T...后来才意识到它的因子都是质数...qwq怕不是这就是学知识学傻了.. 题意:$ G^{\Sigma_{d|n} \space C_n ...
- [SDOI2010]古代猪文 (欧拉,卢卡斯,中国剩余)
[SDOI2010]古代猪文 \(solution:\) 这道题感觉综合性极强,用到了许多数论中的知识: 质因子,约数,组合数 欧拉定理 卢卡斯定理 中国剩余定理 首先我们读题,发现题目需要我们枚举k ...
- 【bzoj1951】: [Sdoi2010]古代猪文 数论-中国剩余定理-Lucas定理
[bzoj1951]: [Sdoi2010]古代猪文 因为999911659是个素数 欧拉定理得 然后指数上中国剩余定理 然后分别lucas定理就好了 注意G==P的时候的特判 /* http://w ...
- 1951: [Sdoi2010]古代猪文
1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 2171 Solved: 904[Submit][Status] ...
- 洛咕 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]古代猪文 比较综合的一题 前置:Lucas 定理,crt 求的是: \[g^x\bmod 999911659,\text{其中}x=\sum_{d\mid n}\tbi ...
随机推荐
- JS截取字符串substr 和 substring方法的区别
substr 方法 返回一个从指定位置开始的指定长度的子字符串. stringvar.substr(start [, length ]) 参数 stringvar 必选项.要提取子字符串的字符串文字或 ...
- SQL Server中锁与事务隔离级别
SQL Server中的锁分为两类: 共享锁 排它锁 锁的兼容性:事务间锁的相互影响称为锁的兼容性. 锁模式 是否可以持有排它锁 是否可以持有共享锁 已持有排它锁 否 否 已持有共享锁 否 是 SQL ...
- razor视图使用三元表达式
根据条件是否满足给input标签添加属性. <input type="radio" value="1" name="PortType" ...
- asp.net前台页面与后台之间传值,
在前台用 js 获取到的 “值 ”需要传到后台,在后台调用, ****** 原有传入的 “值 ” 不要被覆盖 1.最简单的在页面写一个隐藏表单,隐藏标签,把获取到的值赋给隐藏标签之后 ...
- WebForm 【发送邮件】
C#实现简单的SmtpClient发送邮件 分析 需要什么 发送邮件 -- 发送内容 -- 接收邮件 流程(各功能都适用) 创建对象 -- ...
- Java-关于类
java-关于类-成员初始化问题 成员初始化出现错误“ - Syntax error on token ";", , expected” java类不允许对成员进行操作,但可 ...
- HashMap底层实现原理(JDK1.8)源码分析
ref:https://blog.csdn.net/tuke_tuke/article/details/51588156 http://www.cnblogs.com/xiaolovewei/p/79 ...
- 2018-02-17 中文代码示例[译]Scala中创建隐式函数
前言: 学习Scala时, 顺便翻译一下自己有兴趣的文章. 代码中所有命名都中文化了(不是翻译). 比如原文用的是甜甜圈的例子. 原文: Scala Tutorial - Learn How To C ...
- React中路由的基本使用
现在我们来搞一搞React中的路由吧,别问我为什么这木喜欢用搞这个字,因为它比较深奥. 注意下面我们使用的是React-Router-DOM React中的路由基本使用还是满简单的,零碎的小东西有点多 ...
- [VUE ERROR] Duplicate keys detected: 'tab-user'. This may cause an update error.
错误消息如图: 如果你看到此错误消息,则说明 v-for 指令的 key值 重复了,只需修改你的 key值 让其不会重复即可.