2190: [SDOI2008]儀仗隊
阿新 • • 發佈:2018-02-04
com put clu class sqrt problems www int gre
Submit: 3609 Solved: 2354
[Submit][Status][Discuss]
2190: [SDOI2008]儀仗隊
Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 3609 Solved: 2354
[Submit][Status][Discuss]
Description
作為體育委員,C君負責這次運動會儀仗隊的訓練。儀仗隊是由學生組成的N * N的方陣,為了保證隊伍在行進中整齊劃一,C君會跟在儀仗隊的左後方,根據其視線所及的學生人數來判斷隊伍是否整齊(如下圖)。 現在,C君希望你告訴他隊伍整齊時能看到的學生人數。
Input
共一個數N。
Output
共一個數,即C君應看到的學生人數。
Sample Input
4Sample Output
9HINT
【數據規模和約定】 對於 100% 的數據,1 ≤ N ≤ 40000
code
主要求歐拉函數。
1 #include<cstdio> 2 3 const int N = 50000; 4 int phi[N+10],prime[N+10],tot; 5 bool noprime[N+10]; 6 7 void getphi() { 8 for (int i=2; i<=N; ++i) { 9if (!noprime[i]) prime[++tot] = i,phi[i] = i-1; 10 for (int j=1; j<=tot&&i*prime[j]<=N; ++j) { 11 noprime[i * prime[j]] = true; 12 if (i % prime[j] == 0) {phi[i*prime[j]] = phi[i] * prime[j];break;} 13 phi[i * prime[j]] = phi[i] * (prime[j]-1); 14 } 15 } 16 } 17 int main () { 18 getphi(); 19 int n,ans = 0; 20 scanf("%d",&n); 21 if (n==1) {printf("0");return 0;} 22 for (int i=3; i<=n; ++i) 23 ans += phi[i-1]; 24 ans = ans * 2 + 3; 25 printf("%d",ans); 26 return 0; 27 }
$\sqrt(n)$求法
1 #include<cstdio> 2 3 int getphi(int x) { 4 int ret = 1; 5 for (int i=2; i*i<=x; ++i) { 6 if (x % i == 0) { 7 ret *= (i-1); 8 x /= i; 9 while (x % i == 0) x /= i, ret *= i; 10 } 11 } 12 if (x > 1) ret *= (x - 1); 13 return ret; 14 } 15 16 int main () { 17 int n,ans = 0; 18 scanf("%d",&n); 19 if (n==1) {printf("0");return 0;} 20 for (int i=3; i<=n; ++i) 21 ans += getphi(i-1); 22 ans = ans * 2 + 1 + 2; 23 printf("%d",ans); 24 return 0; 25 }View Code
2190: [SDOI2008]儀仗隊