SDOI 2010 古代猪文
Posted evenbao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SDOI 2010 古代猪文相关的知识,希望对你有一定的参考价值。
【题目链接】
https://www.lydsy.com/JudgeOnline/problem.php?id=1951
【算法】
欧拉定理+中国剩余定理 + lucas定理
【代码】
#include<bits/stdc++.h> using namespace std; #define MAXD 40000 typedef long long ll; const ll P = 999911659; const ll m[4] = {2,3,4679,35617}; ll i,j,n,q,cnt,ans,x; ll a[10],factor[100010]; ll fac[MAXD+1][5]; inline void exgcd(ll a,ll b,ll &x,ll &y) { if (b == 0) { x = 1; y = 0; } else { exgcd(b,a%b,y,x); y -= a / b * x; } } inline ll CRT() { int i; ll res = 0,M,T,x; for (i = 0; i < 4; i++) { M = (P - 1) / m[i]; exgcd(M,m[i],T,x); T = (T % m[i] + m[i]) % m[i]; res = (res + (a[i] * M % (P - 1) * T % (P - 1)) % (P - 1)) % (P - 1); } return res; } inline ll power(ll a,ll n,ll p) { ll b = a,res = 1; while (n) { if (n & 1) res = res * b % p; b = b * b % p; n >>= 1; } return res; } inline void init() { int i,j; for (i = 0; i < 4; i++) fac[0][i] = 1; for (i = 1; i <= MAXD; i++) { for (j = 0; j < 4; j++) { fac[i][j] = fac[i-1][j] * i % m[j]; } } } inline ll C(ll x,ll y,ll p) { if (x < y) return 0; if (y == 0) return 1; return fac[x][p] * power(fac[y][p]*fac[x-y][p]%m[p],m[p]-2,m[p]) % m[p]; } inline ll lucas(ll x,ll y,ll p) { if (y == 0) return 1; else return lucas(x/m[p],y/m[p],p) * C(x%m[p],y%m[p],p) % m[p]; } int main() { scanf("%lld%lld",&n,&q); if (q == P) { printf("0 "); return 0; } cnt = 0; for (i = 1; i <= sqrt(n); i++) { if (n % i == 0) { factor[++cnt] = i; if (i * i != n) factor[++cnt] = n / i; } } init(); for (i = 1; i <= cnt; i++) { for (j = 0; j < 4; j++) { a[j] = lucas(n,factor[i],j); } x = (x + CRT()) % (P - 1); } ans = power(q,x,P); printf("%lld ",ans); return 0; }
以上是关于SDOI 2010 古代猪文的主要内容,如果未能解决你的问题,请参考以下文章