线每次穿过一个格子都会经过一条边
就可以得到要走r+c-1,但是x/y=r/c处经两个边但只穿了一个格子所以
穿过格子数N=R+C-gcd(R,C)
我们现在知道N,求满足该式的解的个数
R和C是肯定可以被gcd(R,C)整除,所以等式右边可以被gcd整除,所以左边——N可以被gcd整除
此时r和c互质,n是N的因数
即gcd(r,c)=1
gcd(r,c)=gcd(r+c,c)=gcd(n+1,c)=1
求
#include <bits/stdc++.h> using namespace std; const int N=1e6+4; int n,ans; int prime[N],phi[N],cnt; bool st[N]; int main(int argc, char** argv) { cin>>n; for(int i=2;i<=n+1;i++){ if(!st[i]){ prime[cnt++]=i; phi[i]=i-1; } if(n%(i-1)==0) ans+=phi[i];//因为n是不变的所以不能用n的因数分解的方式写(每次要n/i) for(int j=0;prime[j]<=(n+1)/i;j++){ st[i*prime[j]]=true; if(i%prime[j]==0){ phi[i*prime[j]]=phi[i]*prime[j]; break; }else{ phi[i*prime[j]]=phi[i]*(prime[j]-1); } } } cout<<(ans+1)/2<<endl; return 0; }