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

做这个题大概需要直到以下姿势:快速幂,费马小定理,卢卡斯定理,中国剩余定理。(大概也就这些

题目大概是让求

g∑d|nCdnmodp

然后根据费马小定理原式

=g∑d|nCdnmod(p?1)modp

然后也就是要求指数上的这个东西 ∑d|nCdnmod(p?1)

然后p?1还不是质数。。需要分解成质因子然后用中国剩余定理合并,然后还要求组合数还要卢卡斯定理,最后特判一下g=p的情况

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#define ll long long
#define mod 999911659 //2 3 4679 35617
#define N 100001
using namespace std;
int sc()
{
    int i=0,f=1; char c=getchar();
    while(c>‘9‘||c<‘0‘){if(c==‘-‘)f=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘)i=i*10+c-‘0‘,c=getchar();
    return i*f;
}
ll ans[4],fac[4][35666],inv[4][35666],p[4]={2,3,4679,35617};
ll n,g,a;
void pre()
{
    for(int i=0;i<4;i++)
    {
        fac[i][0]=inv[i][0]=fac[i][1]=inv[i][1]=1;
        for(int j=2;j<p[i];j++)
            fac[i][j]=fac[i][j-1]*j%p[i],
            inv[i][j]=inv[i][p[i]%j]*(p[i]-p[i]/j)%p[i];
        for(int j=2;j<p[i];j++)
            inv[i][j]=inv[i][j]*inv[i][j-1]%p[i];
    }
}
ll C(ll n,ll m,int i)
{
    if(n<m)return 0;
    if(n<p[i]&&m<p[i])return fac[i][n]*inv[i][m]*inv[i][n-m]%p[i];
    return C(n/p[i],m/p[i],i)*C(n%p[i],m%p[i],i)%p[i];
}
void solve(ll m)
{
    for(int i=0;i<4;i++)
        ans[i]=(ans[i]+C(n,m,i))%p[i];
}
void ex_gcd(ll x,ll y,ll &a,ll &b)
{
    if(x==0){a=0,b=1;return;}
    ex_gcd(y%x,x,b,a);
    a-=b*(y/x);
}
int cal(ll x,int y)
{
    ll ans=1;
    for(;y;x=x*x%mod,y>>=1)
        if(y&1)ans=ans*x%mod;
    return ans;
}
int main()
{
    pre();n=sc(),g=sc();a=sqrt(n);
    if(g==mod){puts("0");return 0;}
    for(int i=1;i<=a;i++)
        if(n%i==0)
        {
            solve(i);
            if(i*i!=n)solve(n/i);
        }
    for(int i=0;i<3;i++)
    {
        ll p1=p[i],p2=p[i+1],k1,k2;
        p[i+1]=p[i+1]*p[i];
        ex_gcd(p1,p2,k1,k2);
        k1=k1%p2*(ans[i+1]-ans[i]);
        ans[i+1]=(k1*p1+ans[i])%p[i+1];
    }
    printf("%d\n",cal(g,(ans[3]+p[3])%p[3]));
    return 0;
}
时间: 2024-10-14 08:05:42

1951: [Sdoi2010]古代猪文|数论大合集的相关文章

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]古代猪文

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

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

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

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

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

bzoj1951 [Sdoi2010]古代猪文 ——数论综合

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1951 题意就是要求 G^( ∑(k|n) C(n,k) ) % p,用费马小定理处理指数,卢卡斯定理处理大组合数,取模用中国剩余定理合并: 好想难写的感觉(其实也不难写?): 关于中国剩余定理,可以看这篇博客:https://www.cnblogs.com/MashiroSky/p/5918158.html 第一次写中国剩余定理合并模数,还有一点不解的地方,写在注释里. 代码如下: #in

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