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 namespace std;
const int p=999911659,N=50005;
int g,n,m[5],fac[5][N],t[5]={2,3,4679,35617};
int read()
{
    int r=0,f=1;
    char p=getchar();
    while(p>‘9‘||p<‘0‘)
    {
        if(p==‘-‘)
            f=-1;
        p=getchar();
    }
    while(p>=‘0‘&&p<=‘9‘)
    {
        r=r*10+p-48;
        p=getchar();
    }
    return r*f;
}
int ksm(long long a,int b,int p)
{
    long long r=1ll;
    while(b)
    {
        if(b&1)
            r=r*a%p;
        a=a*a%p;
        b>>=1;
    }
    return r;
}
int C(int n,int m,int x)
{
    if(n<m)
        return 0;
    return fac[x][n]*ksm(fac[x][n-m]*fac[x][m],t[x]-2,t[x])%t[x];
}
int lucas(int n,int m,int x)
{
    return !m?1:C(n%t[x],m%t[x],x)*lucas(n/t[x],m/t[x],x)%t[x];
}
void exgcd(int a,int b,int &x,int &y)
{
    if(b==0)
    {
        x=1,y=0;
        return;
    }
    exgcd(b,a%b,y,x);
    y-=a/b*x;
}
int wk()
{
    int a,b,x,y;
    a=t[0],b=m[0];
    for(int i=1;i<4;i++)
    {
        exgcd(a,t[i],x,y);
        x=(((m[i]-b)*x)%t[i]+t[i])%t[i];
        b=b+a*x;
        a=a*t[i];
    }
    return b;
}
int main()
{
    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];
    }
    n=read(),g=read();
    if(g==p)
    {
        puts("0");
        return 0;
    }
    g%=p;
    for(int i=1;i*i<=n;i++)
        if(n%i==0)
        {
            int now=n/i;
            for(int j=0;j<4;j++)
            {
                if(now!=i)
                    m[j]=(m[j]+lucas(n,i,j))%t[j];
                m[j]=(m[j]+lucas(n,now,j))%t[j];
            }
        }
    printf("%d\n",ksm(g,wk(),p));
    return 0;
}

原文地址:https://www.cnblogs.com/lokiii/p/8375953.html

时间: 2024-12-07 14:47:02

bzoj 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必须

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

1951: [Sdoi2010]古代猪文

1951: [Sdoi2010]古代猪文 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 2171  Solved: 904[Submit][Status][Discuss] Description “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边海的那边的某片风水宝地曾经存在过一个猪王国.猪王国地理位置偏僻,实施的是适应当时

【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为素数,所以用套路:分开求解后用中国剩余定理合

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

P2480 [SDOI2010]古代猪文

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

BZOJ1951 [Sdoi2010]古代猪文

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! 题目链接:BZOJ1951 正解:中国剩余定理+费马小定理+$Lucas$定理 解题报告: 这道题可以说是数论+组合大综合题- 题目求的是$\sum_{d|n} g^{C_n^d}$,模数$p$是质数(特判$g=p!$),根据费马小定理,我们可以把幂上的数