【Lucas定理/费马小定理/中国剩余定理/扩展欧几里得】[BZOJ 1951] 古代猪文

[Description] 求

[Solution]

容易得到,

所以,重点在怎么求

如果是p-1是个质数,我们可以用sqrt(n)的时间枚举所有d,用Lucas定理分别计算求和即可。

但是我们发现p-1=2*3*4679*35617,并不是一个质数,所以Lucas定理不能用了吗?并不,我们可以算出这个合式分别对2、3、4679、35617的模值,写出四个同余方程,再用孙子定理求解即可。注意特判g==p的情况,此时费马小定理不成立,ans=0.

[Code]

#include<cmath>
#include<cstdio>

typedef long long ll;
const int mod=999911659;
ll prime[4]={2,3,4679,35617};
ll num[4],inver[4];

void exgcd(ll x,ll y,ll&a,ll&b){
    if(!y) a=1,b=0;
    else{ exgcd(y,x%y,b,a); b-=a*(x/y); }
}

ll pow(ll a,ll n,int p){
    ll ans=1;
    while(n){
     if(n&1) ans=ans*a%p;
     a=a*a%p; n>>=1;
    }
    return ans;
}

ll C(ll m,ll n,ll p){
    if(m<n) return 0;
    if(m==n) return 1;
    if(n>m-n) n=m-n;
    ll ans=1,cm=1,cn=1;
    for(ll i=0;i<n;i++) cm=cm*(m-i)%p,cn=cn*(n-i)%p;
    return cm*pow(cn,p-2,p)%p;
}
ll Lucas(ll m,ll n,ll p){
    if(!n) return 1;
    return (Lucas(m/p,n/p,p)*C(m%p,n%p,p))%p;
}

int get(int n){
    for(int i=1,lim=sqrt(n)+1;i<lim;i++)
         if(!(n%i)){
             for(int j=0;j<4;j++) num[j]=(num[j]+Lucas(n,i,prime[j]))%prime[j];
             if(i*i-n) for(int j=0;j<4;j++) num[j]=(num[j]+Lucas(n,n/i,prime[j]))%prime[j];
         }
    ll mul=1,ans=0;
    for(int i=0;i<4;i++) mul*=prime[i];
    for(ll i=0,t;i<4;i++){
     exgcd(mul/prime[i],prime[i],inver[i],t);
     inver[i]*=mul/prime[i];
    }
    for(int i=0;i<4;i++) ans=(ans+num[i]*inver[i])%(mod-1);
    return (ans+(mod-1))%(mod-1);
}

int main(){
    int n,g;
    scanf("%d%d",&n,&g);
    if(mod==g){ printf("0"); return 0; }
    g%=mod;
    printf("%lld",pow(g,get(n),mod));
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-04 15:05:44

【Lucas定理/费马小定理/中国剩余定理/扩展欧几里得】[BZOJ 1951] 古代猪文的相关文章

[BZOJ 1951][Sdoi2010]古代猪文(Lucas+CRT+费马小定理)

Description “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边海的那边的某片风水宝地曾经存在过一个猪王国.猪王国地理位置偏僻,实施的是适应当时社会的自给自足的庄园经济,很少与外界联系,商贸活动就更少了.因此也很少有其他动物知道这样一个王国. 猪王国虽然不大,但是土地肥沃,屋舍俨然.如果一定要拿什么与之相比的话,那就只能是东晋陶渊明笔下的大家想象中的桃花源了.猪

[CodeVs1515]跳(lucas定理+费马小定理+乘法逆元)

嘿嘿嘿好久没写数学题了,偶尔看到一道写一写... 题目大意:一个(n+1)*(m+1)[0<=n, m<=10^12,n*m<=10^12]的矩阵,C(0,0)=1,C(x,y)=C(x-1,y)+C(x,y-1),求从0,0走到n,m路上最小权值(即为前面的C)和mod 10^9+7. 看到这个C(x,y)=C(x-1,y)+C(x,y-1),第一反应就是杨辉三角,所以这个矩阵其实就是一个由组合数组成的矩阵,第i行第j列的权值为C(i+j,j)[注意这个矩形起点是(0,0)]. 我们可

素数判定(米勒测试定理-费马小定理+快速乘)

1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstdlib> 5 #include<algorithm> 6 #include<vector> 7 #include<ctime> 8 #define llg long long 9 llg i,j,k,x,n,m; 10 using namespace std; 11 ll

SDOI 2010--古代猪文(Lucas算法&amp;费马小定理&amp;中国剩余定理)

发现几乎每次数论题洛谷总是让我TLE一个点.... 附图: 最后那个点优化了很久终于过了.... 题意 iPig在大肥猪学校图书馆中查阅资料,得知远古时期猪文文字总个数为N.当然,一种语言如果字数很多,字典也相应会很大.当时的猪王国国王考虑到如果修一本字典,规模有可能远远超过康熙字典,花费的猪力.物力将难以估量.故考虑再三没有进行这一项劳猪伤财之举.当然,猪王国的文字后来随着历史变迁逐渐进行了简化,去掉了一些不常用的字. iPig打算研究古时某个朝代的猪文文字.根据相关文献记载,那个朝代流传的猪

51 Nod 1352 集合计数(中国剩余定理+扩展欧几里得)

题目链接:点我点我 题意:中文题 题解:由题意我们可以构造出方程:Ax+By=N+1,用扩展欧几里得算出最小的非负整数解x(x确定,y也就确定了),然后再把剩余的数分配掉(以它们的最小公倍数去分). 1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 using namespace std; 5 6 typedef long long LL; 7 8 LL e_gcd(LL a,LL b,

数论初步(费马小定理) - Happy 2004

Description Consider a positive integer X,and let S be the sum of all positive integer divisors of 2004^X. Your job is to determine S modulo 29 (the rest of the division of S by 29). Take X = 1 for an example. The positive integer divisors of 2004^1

CodeForces 300C Beautiful Numbers(乘法逆元/费马小定理+组合数公式+快速幂)

C. Beautiful Numbers time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Vitaly is a very weird man. He's got two favorite digits a and b. Vitaly calls a positive integer good, if the decimal

BZOJ_[HNOI2008]_Cards_(置换+Burnside引理+乘法逆元+费马小定理+快速幂)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1004 共n个卡片,染成r,b,g三种颜色,每种颜色的个数有规定.给出一些置换,可以由置换得到的染色方案视为等价的,求等价类计数. 分析 给出置换求等价类计数,用Burnside引理:等价类计数=(每一个置换不动点的和)/置换数.(不知道的建议去看白书) 其中不动点是指一个染色方案经过置换以后染色与之前完全相同. 1.求不动点个数. 不动点的话同一个循环内的每一个点的颜色必须相同(否则不同颜色

『基础同余和费马小定理』

同余 同余是数论中一个重要的概念,若整数\(a\)与整数\(b\)除以正整数\(m\)的余数相等,则称\(a\),\(b\)再模\(m\)意义下同余,记为\(a\equiv b(mod\ m)\)或\(m|(a-b)\). 同余基础性质 \(1.\)\(a≡a (mod\ m)\),自反性 \(2.\)若\(a≡b (mod\ m)\),则\(b≡a (mod\ m)\),对称性 \(3.\)若\(a≡b (mod\ m)\),\(b≡c (mod\ m)\),则\(a≡c (mod\ m)\)