bzoj 4804 歐拉心算 歐拉函數,莫比烏斯
阿新 • • 發佈:2018-01-12
using discus esc sin getchar arc .com char 答案
Submit: 408 Solved: 244
[Submit][Status][Discuss]
10
歐拉心算
Time Limit: 15 Sec Memory Limit: 256 MBSubmit: 408 Solved: 244
[Submit][Status][Discuss]
Description
給出一個數字N
Input
第一行為一個正整數T,表示數據組數。 接下來T行為詢問,每行包含一個正整數N。 T<=5000,N<=10^7
Output
按讀入順序輸出答案。
Sample Input
110
Sample Output
136HINT
Source
By FancyCoder
1 #include<cstring> 2 #include<cmath> 3 #include<iostream> 4 #include<algorithm> 5 #include<cstdio> 6 7 #define ll long long 8 #define N 10000007 9 using namespace std; 10 inline int read() 11 { 12 int x=0,f=1;char ch=getchar(); 13 while(ch<‘0‘||ch>‘9‘){if (ch==‘-‘)f=-1;ch=getchar();} 14 while(ch>=‘0‘&&ch<=‘9‘){x=(x<<1)+(x<<3)+ch-‘0‘;ch=getchar();} 15 return x*f; 16 } 17 18 int n; 19 int cnt,pri[N],phi[N]; 20 ll sum[N]; 21 bool flag[N]; 22 23 void init_phi() 24 { 25 phi[1]=1; 26for (int i=2;i<=10000000;i++) 27 { 28 if (!flag[i])pri[++cnt]=i,phi[i]=i-1; 29 for (int j=1;j<=cnt&&pri[j]*i<=10000000;j++) 30 { 31 flag[pri[j]*i]=1; 32 if (i%pri[j]==0) 33 { 34 phi[pri[j]*i]=pri[j]*phi[i]; 35 break; 36 } 37 else phi[pri[j]*i]=phi[i]*phi[pri[j]]; 38 } 39 } 40 for (int i=1;i<=10000000;i++)sum[i]=sum[i-1]+phi[i]; 41 } 42 void solve(ll n) 43 { 44 ll last,ans=0; 45 for (int i=1;i<=n;i=last+1) 46 { 47 last=n/(n/i);//琛ㄧずn涓埌杈懼摢閲屼負姝㈤兘鏄痭/i鐨? 48 ans+=(sum[last]-sum[i-1])*((sum[n/i]<<1)-1); 49 } 50 printf("%lld\n",ans); 51 } 52 int main() 53 { 54 init_phi(); 55 int T=read(); 56 while(T--) 57 { 58 n=read(); 59 solve(n); 60 } 61 }
bzoj 4804 歐拉心算 歐拉函數,莫比烏斯