[luogu6860]象棋与马
根据扩欧$(a,b)=1$必须要满足,同时,若$a+b$为偶数则格子的”奇偶性“不变,因此$a+b$必须为奇数
反过来,容易证明满足$(a,b)=1$且$a+b$为奇数则一定可行(构造从$(0,0)$到$(0,1)$的一组解即可)
不妨假设$a$为奇数、$b$为偶数(答案再乘以2),分两类考虑:
1.$a<b$,显然与$b$互素的数必然是奇数,因此即$\sum_{2i\le n}\varphi(2i)$
2.$a>b$,由于$(a,b)=1$等价于$(a,a-b)=1$,因此每一个小于$a$且与$a$互素的奇数与另一个偶数对应,因此即$\sum_{2i+1\le n}\frac{\varphi(2i+1)}{2}$
不妨先把答案的2乘进去,那么即$f_{n}=\sum_{i=1}^{n}\varphi(i)+\sum_{2i\le n}\varphi(2i)$(偶数要算两次)
根据积性或$\varphi$的计算过程,若$i$为奇数,则有$\varphi(2i)=\varphi(i)$,若$i$为偶数,则$\varphi(2i)=2\varphi(i)$
对于$\sum_{2i\le n}\varphi(2i)$,对$i$的奇偶性分类讨论,即$\sum_{2i\le n}\varphi(2i)=\sum_{4i\le n}\varphi(2i)+\sum_{4i+2\le n}\varphi(2i+1)=f_{\frac{n}{2}}$
根据$f_{n}=\sum_{i=1}^{n}\varphi(i)+f_{\frac{n}{2}}$,再用杜教筛优化,时间复杂度为$o(Tn^{\frac{2}{3}})$,可以通过
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 40000005 4 #define ull unsigned long long 5 int t,vis[N],p[N]; 6 ull n,ans,phi[N]; 7 map<ull,ull>mat; 8 ull calc(ull n){ 9 if (n<N-4)return phi[n]; 10 if (mat[n])return mat[n]; 11 ull ans; 12 if (n&1)ans=(n+1)/2*n; 13 else ans=n/2*(n+1); 14 for(ull i=2,j;i<=n;i=j+1){ 15 j=n/(n/i); 16 ans-=(j-i+1)*calc(n/i); 17 } 18 return mat[n]=ans; 19 } 20 int main(){ 21 phi[1]=1; 22 for(int i=2;i<N-4;i++){ 23 if (!vis[i]){ 24 p[++p[0]]=i; 25 phi[i]=i-1; 26 } 27 for(int j=1;(j<=p[0])&&(i*p[j]<N-4);j++){ 28 vis[i*p[j]]=1; 29 if (i%p[j])phi[i*p[j]]=phi[i]*phi[p[j]]; 30 else{ 31 phi[i*p[j]]=phi[i]*p[j]; 32 break; 33 } 34 } 35 } 36 for(int i=2;i<N-4;i++)phi[i]=phi[i]+phi[i-1]; 37 scanf("%d",&t); 38 while (t--){ 39 scanf("%llu",&n); 40 ans=0; 41 while (n>1){ 42 ans+=calc(n); 43 n/=2; 44 } 45 printf("%llu\n",ans); 46 } 47 }