1. 程式人生 > >2190: [SDOI2008]儀仗隊

2190: [SDOI2008]儀仗隊

com put clu class sqrt problems www int gre

2190: [SDOI2008]儀仗隊

Time Limit: 10 Sec Memory Limit: 259 MB
Submit: 3609 Solved: 2354
[Submit][Status][Discuss]

Description

  作為體育委員,C君負責這次運動會儀仗隊的訓練。儀仗隊是由學生組成的N * N的方陣,為了保證隊伍在行進中整齊劃一,C君會跟在儀仗隊的左後方,根據其視線所及的學生人數來判斷隊伍是否整齊(如下圖)。    技術分享圖片   現在,C君希望你告訴他隊伍整齊時能看到的學生人數。

Input

  共一個數N。

Output

  共一個數,即C君應看到的學生人數。

Sample Input

  4

Sample Output

  9


HINT

【數據規模和約定】   對於 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) {
 9
if (!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]儀仗隊