1951: [Sdoi2010]古代猪文

1951: [Sdoi2010]古代猪文

Time Limit: 1 Sec  Memory Limit: 64 MB
Submit: 2171  Solved: 904
[Submit][Status][Discuss]

Description

“在那山的那边海的那边有一群小肥猪。他们活泼又聪明,他们调皮又灵敏。他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边海的那边的某片风水宝地曾经存在过一个猪王国。猪王国地理位置偏僻,实施的是适应当时社会的自给自足的庄园经济,很少与外界联系,商贸活动就更少了。因此也很少有其他动物知道这样一个王国。 猪王国虽然不大,但是土地肥沃,屋舍俨然。如果一定要拿什么与之相比的话,那就只能是东晋陶渊明笔下的大家想象中的桃花源了。猪王勤政爱民,猪民安居乐业,邻里和睦相处,国家秩序井然,经济欣欣向荣,社会和谐稳定。和谐的社会带给猪民们对工作火红的热情和对未来的粉色的憧憬。 小猪iPig是猪王国的一个很普通的公民。小猪今年10岁了,在大肥猪学校上小学三年级。和大多数猪一样,他不是很聪明,因此经常遇到很多或者稀奇古怪或者旁人看来轻而易举的事情令他大伤脑筋。小猪后来参加了全猪信息学奥林匹克竞赛(Pig Olympiad in Informatics, POI),取得了不错的名次,最终保送进入了猪王国大学(Pig Kingdom University, PKU)深造。 现在的小猪已经能用计算机解决简单的问题了,比如能用P++语言编写程序计算出A + B的值。这个“成就”已经成为了他津津乐道的话题。当然,不明真相的同学们也开始对他刮目相看啦~ 小猪的故事就将从此展开,伴随大家两天时间,希望大家能够喜欢小猪。 题目描述 猪王国的文明源远流长,博大精深。 iPig在大肥猪学校图书馆中查阅资料,得知远古时期猪文文字总个数为N。当然,一种语言如果字数很多,字典也相应会很大。当时的猪王国国王考虑到如果修一本字典,规模有可能远远超过康熙字典,花费的猪力、物力将难以估量。故考虑再三没有进行这一项劳猪伤财之举。当然,猪王国的文字后来随着历史变迁逐渐进行了简化,去掉了一些不常用的字。 iPig打算研究古时某个朝代的猪文文字。根据相关文献记载,那个朝代流传的猪文文字恰好为远古时期的k分之一,其中k是N的一个正约数(可以是1和N)。不过具体是哪k分之一,以及k是多少,由于历史过于久远,已经无从考证了。 iPig觉得只要符合文献,每一种能整除N的k都是有可能的。他打算考虑到所有可能的k。显然当k等于某个定值时,该朝的猪文文字个数为N / k。然而从N个文字中保留下N / k个的情况也是相当多的。iPig预计,如果所有可能的k的所有情况数加起来为P的话,那么他研究古代文字的代价将会是G的P次方。 现在他想知道猪王国研究古代文字的代价是多少。由于iPig觉得这个数字可能是天文数字,所以你只需要告诉他答案除以999911659的余数就可以了。

Input

有且仅有一行:两个数N、G,用一个空格分开。

Output

有且仅有一行:一个数,表示答案除以999911659的余数。

Sample Input

4 2

Sample Output

2048

HINT

10%的数据中,1 <= N <= 50;
20%的数据中,1 <= N <= 1000;
40%的数据中,1 <= N <= 100000;
100%的数据中,1 <= G <= 1000000000,1 <= N <= 1000000000。

Source

Sdoi2010 Contest2

题目就是如上//表示根本没读出这个意思。样例已经验证了,so~

根据欧拉定理我们可以得到

原式为(G^(Σi|n C(n,i) mod 999911658)) mod 999911659

(a^b=a^φ(b) mod b 此处b为素数,so φ(b)=b-1;)

也就是说求解出上试在加一个快速幂就好了

如何求解上式呢?

999911658=2*3*4679*35617 是一个Square Free Number

对于这种每个素因子的次数都是1的数来说,我们可以对它分别求解,然后用中国剩余定理去合并

所以我们就利用lucas定理(lucas(n,i,p)=C(n%p,i%p)*lucas(n/p,i/p,p))去求解C对于每一个素数的解

最后再合并就好了

#include<cstdio>
using namespace std;
typedef long long ll;
const int P=999911659;
int M[5],t[5]={2,3,4679,35617};
int N,G,fac[5][(int)4e4];
int fpow(ll a,ll p,ll mod){
    ll res=1;
    for(;p;p>>=1,a=a*a%mod) if(p&1) res=res*a%mod;
    return res;
}
int C(int n,int m,int x){
    if(m>n) return 0;
    return fac[x][n]*fpow(fac[x][n-m]*fac[x][m],t[x]-2,t[x])%t[x];
}
void exgcd(int a,int b,ll &x,ll &y){
    if(!b){x=1;y=0;return ;}
    exgcd(b,a%b,x,y);
    ll t=x;x=y;y=t-a/b*y;
}
int lucas(int a,int b,int x){
    if(!b) return 1;
    return C(a%t[x],b%t[x],x)*lucas(a/t[x],b/t[x],x)%t[x];
}
ll CRT(){
    ll x0,y0,ans=0,Z=P-1;
    for(int i=0;i<4;i++){
        int d=Z/t[i];
        exgcd(d,t[i],x0,y0);
        ans=(ans+d*x0*M[i])%Z;
    }
    while(ans<=0) ans+=Z;
    return ans;
}
int main(){
    scanf("%d%d",&N,&G);
    if(N==G){puts("0");return 0;}
    G%=P;
    for(int i=0;i<4;i++){
        fac[i][0]=1;
        for(int j=1;j<=t[i];j++){
            fac[i][j]=(fac[i][j-1]*j)%t[i];
        }
    }
    for(int i=1,tmp;i*i<=N;i++){
        if(N%i==0){
            tmp=N/i;
            for(int j=0;j<4;j++){
                if(tmp!=i) M[j]=(M[j]+lucas(N,i,j))%t[j];
                M[j]=(M[j]+lucas(N,tmp,j))%t[j];
            }
        }
    }
    printf("%d",fpow(G,CRT(),P));
    return 0;
}
时间: 2024-10-11 05:55:11

1951: [Sdoi2010]古代猪文的相关文章

bzoj 1951 [Sdoi2010]古代猪文(数论知识)

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

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

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

BZOJ 1951 SDOI2010 古代猪文 数论 Lucas定理

题目大意:给定N,G,求 首先由欧拉定理易知当A与p互质时A^B %p=A^(B%φ(p) ) %p 这里p是一个质数 于是φ(p)=p-1=999911658 然后由于这个数不是质数 难以处理 我们将它分解质因数 然后对于每个质因数的解用中国剩余定理合并即可 然后就是999911658有一个很好的性质 999911658=2*3*4679*35617 每个质因数的次数都是1次 于是我们可以套用卢卡斯定理 预先处理出对于每个质因数的阶乘和阶乘的逆元即可 注意此题有个细节 就是欧拉定理中a与p必须

1951: [Sdoi2010]古代猪文|数论大合集

做这个题大概需要直到以下姿势:快速幂,费马小定理,卢卡斯定理,中国剩余定理.(大概也就这些 题目大概是让求 g∑d|nCdnmodp 然后根据费马小定理原式 =g∑d|nCdnmod(p?1)modp 然后也就是要求指数上的这个东西 ∑d|nCdnmod(p?1) 然后p?1还不是质数..需要分解成质因子然后用中国剩余定理合并,然后还要求组合数还要卢卡斯定理,最后特判一下g=p的情况 #include<algorithm> #include<iostream> #include&l

bzoj 1951: [Sdoi2010]古代猪文

1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cmath> 5 #define ll long long 6 #define mul 999911659 7 using namespace std; 8 int n,g,a[4]; 9 int sh[4]={2,3,4679,35617},C1[4][35618]; 10 void exgcd(int a1,int

【BZOJ】1951[Sdoi2010]古代猪文

[算法]欧拉定理+组合数取模(lucas)+中国剩余定理(CRT) [题解]给定G,N 先考虑简化幂运算,因为模数为素数,由欧拉定理可知G^k=G^(k%φ(p)) mod p,显然G^(k%φ(p)) mod p可以用快速幂求解 此时观察到2p>max(n)>p,所以可能n=p,此时不满足n,p互素,答案直接为0. 对于幂取模部分,因为p是素数,φ(p)=p-1,p-1=999911658=2*3*4679*35617. 由于lucas定理要求p为素数,所以用套路:分开求解后用中国剩余定理合

bzoj 1951: [Sdoi2010]古代猪文 【中国剩余定理+欧拉定理+组合数学+卢卡斯定理】

首先化简,题目要求的是 \[ G^{\sum_{i|n}C_{n}^{i}}\%p \] 对于乘方形式快速幂就行了,因为p是质数,所以可以用欧拉定理 \[ G^{\sum_{i|n}C_{n}^{i}\%\varphi(p)} \] \[ G^{\sum_{i|n}C_{n}^{i}\%p-1} \] 因为p-1不是质数,所以把它质因数分解为2,3,4679,35617,最后用中国剩余定理合并即可. #include<iostream> #include<cstdio> using

P2480 [SDOI2010]古代猪文

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

【BZOJ 1951】 [Sdoi2010]古代猪文

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