BZOJ 2190: [SDOI2008]儀仗隊
阿新 • • 發佈:2017-07-27
pre 現在 scan bzoj for clu 判斷 time code Time Limit: 10 Sec Memory Limit: 259 MB
Submit: 3213 Solved: 2072
[Submit][Status][Discuss]
Submit: 3213 Solved: 2072
[Submit][Status][Discuss]
Description
作為體育委員,C君負責這次運動會儀仗隊的訓練。儀仗隊是由學生組成的N * N的方陣,為了保證隊伍在行進中整齊劃一,C君會跟在儀仗隊的左後方,根據其視線所及的學生人數來判斷隊伍是否整齊(如下圖)。 現在,C君希望你告訴他隊伍整齊時能看到的學生人數。
Input
共一個數N。
Output
共一個數,即C君應看到的學生人數。
Sample Input
4Sample Output
9HINT
【數據規模和約定】 對於 100% 的數據,1 ≤ N ≤ 40000
Source
設左下角坐標為(0,0)
若任意一點坐標為(x,y) 設gcd(x,y)=k,
如果k!=1 ,則 一定會被(x/k,y/k)擋住 所以被看到的必要條件是k==1
問題就變成了
把棋盤劈成兩半 則變成求
可以看出 括號內的式子就是歐拉函數
問題變為求歐拉函數的值
屠龍寶刀點擊就送
#include <cstdio> intget_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); returnans; } 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]儀仗隊