本题前置知识:
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 ab≡abmodφ(n)(modn)
2. L u c a s Lucas Lucas定理:若 p p p为质数,则对于任意整数 1 ≤ m ≤ n 1\leq m \leq n 1≤m≤n 有: 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 Cnm≡Cnmodpmmodp∗Cn/pm/p(modp)
3.若 n n n为质数,则 φ ( n ) = n − 1 \varphi(n)=n-1 φ(n)=n−1
证明:这样,然后这样,再这样,最后这样。
证毕
回到题目,给定整数
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
q∑d∣nCndmod999911659
若
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}
q∑d∣nCnd≡q∑d∣nCndmod999911658(mod999911659)
然后就是要求出
∑
d
∣
n
C
n
d
m
o
d
999911658
{\sum_{d|n}C^d_n\bmod 999911658}
d∣n∑Cndmod999911658
但是
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} ∑d∣nCnd对 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} ∑d∣nCndmod999911658的最小正整数解 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) 0≤r<φ(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 ab≡aq∗φ(n)+r≡(aφ(n))q∗1q∗ar≡ar≡abmodφ(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 Cmn≡C⌊pm⌋⌊pn⌋∗Cmmodpnmodpmodp
对于任意的质数 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 ) Cpn≡0modp(n=0且n=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=0∑pCpixi
在模
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)⌊pm⌋p∗(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=0∑mCmixi=⎝⎛i=0∑⌊pm⌋C⌊pm⌋ixpi⎠⎞(i=0∑mmodpCmmodpixi)
等号左边
i
=
n
i=n
i=n时,等号右边唯一能组合出来
x
n
x^n
xn的就是
x
⌊
n
p
⌋
∗
p
x^{\lfloor {n\over p}\rfloor*p}
x⌊pn⌋∗p和
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;
}