古代猪文题解

原题传送门

本题前置知识:

1.欧拉定理:对于正整数 a , n a,n a,n, 若其互质,则对于任何正整数 b b b,有 a b ≡ a b m o d    φ ( n ) ( m o d n ) a^b\equiv a^{b \mod {\varphi(n)}}\pmod n ababmodφ(n)(modn)

2. L u c a s Lucas Lucas定理:若 p p p为质数,则对于任意整数 1 ≤ m ≤ n 1\leq m \leq n 1mn 有: C n m ≡ C n   m o d   p m   m o d   p ∗ C n / p m / p ( m o d p ) C^{m}_{n}\equiv C^{m\bmod p}_{n \bmod p}*C^{m/p}_{n/p}\pmod p CnmCnmodpmmodpCn/pm/p(modp)

3.若 n n n为质数,则 φ ( n ) = n − 1 \varphi(n)=n-1 φ(n)=n1

证明:这样,然后这样,再这样,最后这样。

证毕

回到题目,给定整数 q q q, n n n,计算
q ∑ d ∣ n C n d   m o d   999911659 q^{\sum_{d|n}C^d_n}\bmod 999911659 qdnCndmod999911659
q = 999911659 q=999911659 q=999911659上式显然为 0 0 0。由于 999911659 999911659 999911659为质数,所以 999911659 999911659 999911659 q q q互质。

由欧拉定理得:
q ∑ d ∣ n C n d ≡ q ∑ d ∣ n C n d   m o d   999911658 ( m o d 999911659 ) q^{\sum_{d|n}C^d_n}\equiv q ^{\sum_{d|n}C^d_n\bmod 999911658}\pmod {999911659} qdnCndqdnCndmod999911658(mod999911659)
然后就是要求出
∑ d ∣ n C n d   m o d   999911658 {\sum_{d|n}C^d_n\bmod 999911658} dnCndmod999911658
但是 999911658 999911658 999911658并不是一个质数,这时 L u c a s Lucas Lucas定理就没法直接用了。

所以直接搞肯定不行了。(不然怎么是SDOI的题)

原以为这题搞不了了。。。。。

然后突然知道了个方法:分解质因数

对于 999911658 999911658 999911658,对其进行质因数分解, 999911658 = 2 × 3 × 4679 × 35617 999911658=2\times 3 \times 4679 \times 35617 999911658=2×3×4679×35617

然后枚举 n n n的约数 d d d,运用 L u c a s Lucas Lucas定理求出 C n d C^{d}_{n} Cnd的值,分别求出 ∑ d ∣ n C n d {\sum_{d|n}C^d_n} dnCnd 2 , 3 , 4679 , 35617 2,3,4679,35617 2,3,4679,35617四个质数取模之后的值

将其记为 a 1 , a 2 , a 3 , a 4 a_1,a_2,a_3,a_4 a1,a2,a3,a4

对于质数 p p p,我们可以求出 p p p以内的所有阶乘以及阶乘的模 p p p的乘法逆元。用于表示 p p p进制下的组合数。( L u c a s Lucas Lucas定理中的)

最后就是用中国剩余定理求出线性同余的解:
{ x   m o d   2 = a 1 x   m o d   3 = a 2 x   m o d   4679 = a 3 x   m o d   35617 = a 4 \begin{cases} x\bmod 2=a_1\\ x\bmod 3=a_2 \\ x \bmod 4679=a_3 \\ x \bmod 35617 = a_4 \end{cases} xmod2=a1xmod3=a2xmod4679=a3xmod35617=a4

最终就能求得 ∑ d ∣ n C n d   m o d   999911658 {\sum_{d|n}C^d_n\bmod 999911658} dnCndmod999911658的最小正整数解 x x x。再用快速幂可以求出最终的解。

这道题呢是一道综合性很强的题目,所需要的知识也相当的多。是一道不可多得的好题。

最后附上三个前置知识的无法完全保证正确性的证明:

1.欧拉定理:

b = q ∗ φ ( n ) + r b=q*\varphi(n)+r b=qφ(n)+r,其中 0 ≤ r < φ ( n ) 0\leq r<\varphi(n) 0r<φ(n),即 r = b   m o d   φ ( n ) r=b\bmod \varphi(n) r=bmodφ(n)

那么 a b ≡ a q ∗ φ ( n ) + r ≡ ( a φ ( n ) ) q ∗ 1 q ∗ a r ≡ a r ≡ a b   m o d   φ ( n ) ( m o d n ) a^b\equiv a^{q*\varphi(n)+r}\equiv (a^{\varphi(n)})^{q}*1^q*a^r\equiv a^r\equiv a^{b \bmod \varphi(n)}\pmod n abaqφ(n)+r(aφ(n))q1qararabmodφ(n)(modn)

2. L u c a s Lucas Lucas定理:

C m n ≡ C ⌊ m p ⌋ ⌊ n p ⌋ ∗ C m   m o d   p n   m o d   p   m o d   p C^{n}_{m}\equiv C^{\lfloor {n\over p}\rfloor}_{\lfloor {m\over p}\rfloor}*C^{n\bmod p }_{m\bmod p}\bmod p CmnCpmpnCmmodpnmodpmodp

对于任意的质数 p p p:

C p n ≡ 0   m o d   p ( n ≠ 0 且 n ≠ p ) C^{n}_{p}\equiv 0 \bmod p (n\not= 0 且 n\not = p ) Cpn0modp(n=0n=p)

对于任意的一个实数 x x x有:
( x + 1 ) p = ∑ i = 0 p C p i x i (x+1)^p=\sum^p_{i=0}C^i_px_i (x+1)p=i=0pCpixi
在模 p p p意义下有:

( x + 1 ) p ≡ ( x p + 1 )   m o d   p (x+1)^p\equiv (x^p+1)\bmod p (x+1)p(xp+1)modp

对于任意一个整数 m m m:

( x + 1 ) m = ( x + 1 ) ⌊ m p ⌋ p ∗ ( x + 1 ) m   m o d   p (x+1)^m=(x+1)^{\lfloor{m\over p}\rfloor p}*(x+1)^{m\bmod p} (x+1)m=(x+1)pmp(x+1)mmodp

( x + 1 ) m = ( x p + 1 ) ⌊ m p ⌋ ∗ ( x + 1 ) m   m o d   p (x+1)^m=(x^p+1)^{\lfloor{m\over p}\rfloor}*(x+1)^{m\bmod p} (x+1)m=(xp+1)pm(x+1)mmodp

再用二项式定理展开:
∑ i = 0 m C m i x i = ( ∑ i = 0 ⌊ m p ⌋ C ⌊ m p ⌋ i x p i ) ( ∑ i = 0 m   m o d   p C m   m o d   p i x i ) \sum_{i=0}^{m}C_{m}^{i}x^i=\left(\sum_{i=0}^{\lfloor{m\over p}\rfloor}C_{\lfloor{m\over p}\rfloor}^{i}x^{p_i}\right)\left(\sum_{i=0}^{m\bmod p}C_{m\bmod p}^{i}x^i\right) i=0mCmixi=i=0pmCpmixpi(i=0mmodpCmmodpixi)
等号左边 i = n i=n i=n时,等号右边唯一能组合出来 x n x^n xn的就是 x ⌊ n p ⌋ ∗ p x^{\lfloor {n\over p}\rfloor*p} xpnp x n   m o d   p x^{n\bmod p} xnmodp

3.显然成立

最后奉上又臭又长的code:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int twx=+100;
const int inf=0x3f3f3f3f;
int MOD=999911658;
ll read()
{
    ll sum=0;
    ll flag=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-')
        {
            flag=-1;
        }
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        sum=((sum*10)+c-'0');
        c=getchar();
    }
    return sum*flag;
}
const int a[4]={2,3,4679,35617};
int p[36000];
int b[4];
int n;
int g;
int ans;
ll x,y;
ll POW(ll a,ll b,ll MOD)
{
    ll res=1;
    a%=MOD;
    for(;b;b>>=1)
    {
        if(b&1)
        {
            res=res*a%MOD;
        }
		a=a*a%MOD;
    }
    return res%MOD;
}
ll exgcd(ll a,ll b,ll &x,ll &y)
{
	if(b==0)
	{
		x=1;
		y=0;
		return a;
	}
    ll res=exgcd(b,a%b,x,y);
	ll t=x;
	x=y;
	y=t-(a/b)*y;
	return res;
}
ll gcd(ll x,ll y)
{
    return !x?y:gcd(y%x,x);
}
ll inv(ll a,ll b)
{
    ll x,y;
    exgcd(a,b,x,y);
    return (x%b+b)%b;
}
ll calc(ll x,ll mod)
{
	ll ans=1;
    ll y;
    ll a,b;
	for(y=n;x;x/=mod,y/=mod)
	{
		a=x%mod;
        b=y%mod;
		ans=(ll)ans*p[b]%mod*inv(p[a],mod)%mod*inv(b<a?0:p[b-a],mod)%mod;
	}
	return ans;
}
void init()
{
	n=read();
    g=read();
}
void work()
{
	g%=MOD+1;
	if(!g)
    {
        puts("0");
        exit(0);
    }
    int i;
    for(p[0]=i=1;i<=a[3];i++)
    {
        p[i]=(ll)p[i-1]*i%MOD;
    }
    for(int i=1;i<=sqrt(n);i++)
    {
        if(n%i==0)
        {
            for(int j=0;j<=3;j++)
            {
                b[j]=(b[j]+calc(i,a[j]))%a[j];
            }
            if(i*i!=n)
            {
                for(int j=0;j<=3;j++)
                {
                    b[j]=(b[j]+calc(n/i,a[j]))%a[j]; 
                }
            }
        }
    }
    for(int i=0;i<=3;i++)
    {
        exgcd(MOD/a[i],a[i],x,y);
		ans=(ans+(ll)x*(MOD/a[i])%MOD*b[i])%MOD;
    }
	ans=(ans+MOD)%MOD;
    MOD++;
	ans=POW(g,ans,MOD);
	printf("%d\n",ans);
}
int main()
{
	//freopen("test.in","r",stdin);
	//freopen("test.out","w",stdout);
    init();
    work();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值