哇,这道题真的好好,让我这个菜鸡充分体会到卢卡斯和欧拉函数的强大!

先把题意抽象出来!就是计算这个东西。

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]古代猪文 (卢卡斯定理,欧拉函数)的更多相关文章

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

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

  2. 【BZOJ1951】[Sdoi2010]古代猪文 Lucas定理+CRT

    [BZOJ1951][Sdoi2010]古代猪文 Description 求$X=\sum\limits_{d|n}C_n^d$,$Ans=G^X (\mod 999911659)$. Input 有 ...

  3. BZOJ 1951: [Sdoi2010]古代猪文 [Lucas定理 中国剩余定理]

    1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 2194  Solved: 919[Submit][Status] ...

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

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

  5. [SDOI2010]古代猪文 (欧拉,卢卡斯,中国剩余)

    [SDOI2010]古代猪文 \(solution:\) 这道题感觉综合性极强,用到了许多数论中的知识: 质因子,约数,组合数 欧拉定理 卢卡斯定理 中国剩余定理 首先我们读题,发现题目需要我们枚举k ...

  6. 【bzoj1951】: [Sdoi2010]古代猪文 数论-中国剩余定理-Lucas定理

    [bzoj1951]: [Sdoi2010]古代猪文 因为999911659是个素数 欧拉定理得 然后指数上中国剩余定理 然后分别lucas定理就好了 注意G==P的时候的特判 /* http://w ...

  7. 1951: [Sdoi2010]古代猪文

    1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 2171  Solved: 904[Submit][Status] ...

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

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

  9. P2480 [SDOI2010]古代猪文

    P2480 [SDOI2010]古代猪文 比较综合的一题 前置:Lucas 定理,crt 求的是: \[g^x\bmod 999911659,\text{其中}x=\sum_{d\mid n}\tbi ...

随机推荐

  1. POJ 3037 Skiing(如何使用SPFA求解二维最短路问题)

    题目链接: https://cn.vjudge.net/problem/POJ-3037 Bessie and the rest of Farmer John's cows are taking a ...

  2. git commit之后,想撤销commit

    原文 写完代码后,我们一般这样 git add . //添加所有文件 git commit -m "本功能全部完成" 执行完commit后,想撤回commit,怎么办? 这样凉拌: ...

  3. asp.net session mode 几种状态 (转)

    开发asp.net应用时,修改web.config中的SessionState节点. stateserver模式: <sessionState mode="StateServer&qu ...

  4. C# 基础运算符及运算

    本节主要讲述运算符的分类及其实际运用 运算符 分类 符号 解释 优先级 算数 ++  -- 加加(加1)  减减(减1) 由高到低,即执行顺序由上到下(圆括号的优先级最高) *  /  % 乘  除  ...

  5. 两个有序数组长度分别为m,n,最多m+n次查找找出相同的数

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. 【Redis】5、Redis事务处理

    MULTI .EXEC .DISCARD 和WATCH 是 Redis 事务的基础 1.MULTI  命令用于开启一个事务,它总是返回 OK .MULTI 执行之后,客户端可以继续向服务器发送任意多条 ...

  7. Liquibase使用入门

    1.LiquiBase简介 LiquiBase是一个用于数据库重构和迁移的开源工具,通过日志文件的形式记录数据库的变更,然后执行日志文件中的修改,将数据库更新或回滚到一致的状态.LiquiBase的主 ...

  8. Python全栈学习_day003作业

    day3作业及默写 1,有变量name = "aleX leNb" 完成如下操作: 1) 移除 name 变量对应的值两边的空格,并输出处理结果 print(name.strip( ...

  9. canvas-2lineJoin.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. phothoshop 快捷键

    界面构成: 1 菜单栏 2 工具箱 3 工具属性栏 4 悬浮面板(辅助作用) CTRL + N 新建对话框(对画布进行设置) 回车确定 CTRL + O (字母) 打开对话框(选择图片) 画布的三种显 ...