luogu P2158 [SDOI2008]儀仗隊
阿新 • • 發佈:2017-08-07
phi color can spa clu 判斷 9.png hide std
題目描述
作為體育委員,C君負責這次運動會儀仗隊的訓練。儀仗隊是由學生組成的N * N的方陣,為了保證隊伍在行進中整齊劃一,C君會跟在儀仗隊的左後方,根據其視線所及的學生人數來判斷隊伍是否整齊(如下圖)。 現在,C君希望你告訴他隊伍整齊時能看到的學生人數。
輸入輸出格式
輸入格式:
共一個數N
輸出格式:
共一個數,即C君應看到的學生人數。
輸入輸出樣例
輸入樣例#1:4輸出樣例#1:
9
說明
【數據規模和約定】
對於 100% 的數據,1 ≤ N ≤ 40000
不難發現
以C君為(0,0)點構成坐標系
只有該店的橫坐標與縱坐標互質時才能被看到
那麽就變成就歐拉函數問題
單個求歐拉版
#include<cstdio> using namespace std; const int maxn = 1110101; int oula[maxn]; int prime[maxn]; bool a[maxn]; int n; int phi(int x) { int ret=1; for(int i=2;i*i<=x;i++) { if(x%i==0) { ret*=i-1,x/=i;View Codewhile(x%i==0) { ret*=i;x/=i; } } } if(x>1)ret*=x-1; return ret; } int main () { scanf("%d",&n); int ans=0; for(int i=1;i<n;i++) { ans+=phi(i); } ans=ans*2,ans+=1; printf("%d\n",ans); return 0; }
一起求版
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int n; const int maxn =400004; int phi[maxn]; void get_phi() { phi[1]=1; for(int i=2; i<=n; i++) { if(!phi[i]) for(int j=i; j<=n; j+=i) { if(!phi[j])phi[j]=j; phi[j]=phi[j]/i*(i-1); } } } int main() { scanf("%d",&n); get_phi(); int ans=0; for(int i=1; i<=n-1; i++)ans+=phi[i]; printf("%d",2*ans+1); return 0; }View Code
luogu P2158 [SDOI2008]儀仗隊