[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 }
View Code

 

posted @ 2020-10-21 15:44  PYWBKTDA  阅读(152)  评论(0编辑  收藏  举报