复健复健。。。
标题和题目似乎没什么关系。。。
显然
(x+y)i≡ximodp
(
x
+
y
)
i
≡
x
i
mod
p
左右两边都不能为0。
设
p
p
的原根为,
x+y≡dbmodp,x≡damodp
x
+
y
≡
d
b
mod
p
,
x
≡
d
a
mod
p
。
有:
dbi≡daimodp
d
b
i
≡
d
a
i
mod
p
i(b−a)≡0modϕ(p)
i
(
b
−
a
)
≡
0
mod
ϕ
(
p
)
显然,
b−a=ϕ(p)(ϕ(p),i)k|k∈[1,(ϕ(p),i)−1]
b
−
a
=
ϕ
(
p
)
(
ϕ
(
p
)
,
i
)
k
|
k
∈
[
1
,
(
ϕ
(
p
)
,
i
)
−
1
]
。
那么,设
b−a
b
−
a
任意一个解为
z
z
:
x+y≡xdzmodp
x
+
y
≡
x
d
z
mod
p
yx−1≡dz−1modp
y
x
−
1
≡
d
z
−
1
mod
p
x≡y(dz−1)−1modp
x
≡
y
(
d
z
−
1
)
−
1
mod
p
因为
z
z
必然模不为0,所以每一个
y
y
都存在个对应的
x
x
。
即:。
结果为:
m(∑ϕ(p)i=1i(ϕ(p),i)−∑ϕ(p)i=1i)
m
(
∑
i
=
1
ϕ
(
p
)
i
(
ϕ
(
p
)
,
i
)
−
∑
i
=
1
ϕ
(
p
)
i
)
枚举gcd,有:
∑p−1i=1i(p−1,i)=∑k|p−1k2ϕ(p−1k)p−1k+[k=p−1]2
∑
i
=
1
p
−
1
i
(
p
−
1
,
i
)
=
∑
k
|
p
−
1
k
2
ϕ
(
p
−
1
k
)
p
−
1
k
+
[
k
=
p
−
1
]
2
直接计算即可,复杂度为
O(p–√logp)
O
(
p
l
o
g
p
)
。
#include<algorithm>
#include<string.h>
#include<stdio.h>
#include<cmath>
using namespace std;
#define clr(a) memset(a,0,sizeof(a))
//--Container
//
typedef long long ll;
const ll md=1e9+7;
inline ll qni(ll a,ll b){ll r=1;for(;b;b>>=1,a=a*a%md)if(b&1)r=r*a%md;return r;};
const ll _2=qni(2,md-2);
ll rs;int p[30][2],pd;
void _qs(int n){
int i,j,d=sqrt(n);for(i=2,pd=0;i<=d&&n>1;++i)if(!(n%i)){
for(p[pd][1]=0,p[pd][0]=i;!(n%i);n/=i)p[pd][1]++;++pd;
}
if(n>1){p[pd][0]=n,p[pd][1]=1;++pd;}
};
void _dfs(int ts,int k,int n,int d){
if(d==pd)
rs=(rs+(ll)(n/k)*(n/k)%md*((ll)ts*k%md+(k==1?1:0))%md*_2%md);
else{
_dfs(ts,k,n,d+1);int i;for(i=1,k*=p[d][0],ts*=(p[d][0]-1);i<=p[d][1];++i){
_dfs(ts,k,n,d+1);
ts*=p[d][0],k*=p[d][0];
}
}
};
int ct=0;
void _cl(int n,int m){
int i,j;_qs(n-1);rs=0;_dfs(1,1,n-1,0);rs=(rs+md-((ll)n*(n-1)%md*_2%md))%md;rs=rs*m%md;
printf("Case #%d: %I64d\n",++ct,rs);
};
void cl(){
int n,m;scanf("%d %d",&m,&n);_cl(n,m);
};
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int t;scanf("%d",&t);while(t--)cl();
return 0;
};