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

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

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. Apollo 3 定时/长轮询拉取配置的设计

    前言 如上图所示,Apollo portal 更新配置后,进行轮询的客户端获取更新通知,然后再调用接口获取最新配置.不仅仅只有轮询,还有定时更新(默认 5 分钟一次).目的就是让客户端能够稳定的获取到 ...

  2. SQL partition by的用法

    今天群里看到一个问题,在这里概述下:查询出不同分类下的最新记录.一看这不是很简单的么,要分类那就用Group By; 要最新记录就用Order By呗.然后在自己的表中试着做出来: 首先呢我把表中的数 ...

  3. 学Java的第17天。呃。。。今天有点奇葩

    神奇的老师在网上看到狗跳楼的视频然后就想到抛物线问题: 还是 属性和方法的调用: package sklx; public class Dog{ private float v = 30.0f; pr ...

  4. Vue+Highcharts完全使用

    创建Comp组件 <template> <div class="x-bar"> <div :id="id" :option=&qu ...

  5. Shaping Regions(dfs)

    Shaping Regions Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 124  Solved: 39[Submit][Status][Web B ...

  6. 网页三剑客:HTML+CSS+JavaScript 之 HTML的概述

    HTML(超文本标记语言) 什么是HTML? HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言: HyperText Markup Language HTML 不是一种编程语言,而 ...

  7. 正则表达式+XML+反射+设计模式作业

    正则表达式+XML+反射+设计模式作业 一.    填空题 Class.forName('com.bjsxt.stumgr.entity.Student').newInstance( ); 语句的作用 ...

  8. Python从入门到精通

    最近研究了一下Python,名不虚传,确实挺精彩. 学习一门新的语言,我认为从入门到精通的做法是:下SDK.装IDE.练教程.结合工作应用.不断踩坑进阶.梳理总结 1.下SDK(2.7.15) 下载地 ...

  9. loadrunner 技巧-模拟Run Logic中的随机Action运行

    技巧-模拟Run Logic中的随机Action运行 by:授客 QQ:1033553122   可以这样做,Run-time Settings,删除Action7,然后在其它Action比如Acti ...

  10. JMeter—断言(十一)

    参考<全栈性能测试修炼宝典JMeter实战>第六章 JMeter 元件详解中第六节断言断言用来对服务器的响应数据做验证,常用的断言是响应断言,支持正则表达式. 一.BeanShell As ...