题解 【SP422】
对于一个
观察起始位置和中止位置的变化。先把所有下标变成
如果
「旋转
其中
在本问题中,
总的答案是
开始莫比乌斯反演
预处理
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5,mod=1000003;
inline int quick_pow(int a,int b){
int ret=1;
for(;b;b>>=1,a=1ll*a*a%mod)if(b&1)ret=1ll*ret*a%mod;
return ret;
}
inline int dec(int a,int b){return (a-b<0)?a-b+mod:a-b;}
inline int Inv(int a){return quick_pow(a,mod-2);}
int phi[N],head[N],prime[N],pcnt,Pow[N];
bool vis[N];
struct Edge{
int val,next;
}fac[N*14];
int tot=0;
inline void adde(int u,int v){
fac[++tot]=(Edge){v,head[u]};head[u]=tot;
}
inline void init(int n){
Pow[0]=1;
for(int i=1;i<=n;++i){
Pow[i]=2ll*Pow[i-1]%mod;
for(int j=i;j<=n;j+=i)
adde(j,i);
}
phi[1]=1;
for(int i=2;i<=n;++i){
if(!vis[i]){
prime[++pcnt]=i;
phi[i]=i-1;
}
for(int j=1;j<=pcnt&&prime[j]*i<=n;++j){
vis[i*prime[j]]=1;
if(i%prime[j]==0){
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
}
int a,b,T;
int main(){
init(1000000);
scanf("%d",&T);
while(T--){
scanf("%d %d",&a,&b);
if(!a||!b){
puts("0");
continue;
}
int g=__gcd(a,b),n=(a+b)/g,ret=0;
for(int i=head[n],d;i;i=fac[i].next){
d=fac[i].val;
ret=(ret+1ll*Pow[d*g]*phi[n/d])%mod;
}
printf("%lld\n",dec(Pow[a+b],1ll*ret*g%mod*Inv(a+b)%mod));
}
return 0;
}