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

BZOJ 2190: [SDOI2008]儀仗隊

pre 現在 scan bzoj for clu 判斷 time code

Time Limit: 10 Sec Memory Limit: 259 MB
Submit: 3213 Solved: 2072
[Submit][Status][Discuss]

Description

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

Input

  共一個數N。

Output

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

Sample Input

  4

Sample Output

  9


HINT

【數據規模和約定】   對於 100% 的數據,1 ≤ N ≤ 40000

Source

設左下角坐標為(0,0)

若任意一點坐標為(x,y) 設gcd(x,y)=k,

如果k!=1 ,則 一定會被(x/k,y/k)擋住 所以被看到的必要條件是k==1

問題就變成了 技術分享

把棋盤劈成兩半 則變成求 技術分享

可以看出 括號內的式子就是歐拉函數

問題變為求歐拉函數的值

屠龍寶刀點擊就送

#include <cstdio>

int
get_phi(int n) { int ans=n; if(n%2==0) { while(n%2==0) n/=2; ans/=2; } for(int i=3;i*i<=n;i+=2) { if(n%i==0) { while(n%i==0) n/=i; ans=ans/i*(i-1); } } if(n>1) ans=ans/n*(n-1); return
ans; } int n,ans; int main() { scanf("%d",&n); for(int i=1;i<n;i++) ans+=i==1?1:get_phi(i); printf("%d",ans*2+1); return 0; }

BZOJ 2190: [SDOI2008]儀仗隊