1. 程式人生 > >儀仗隊(SDOI2008)

儀仗隊(SDOI2008)

看輸入輸出就很簡單。 事實上只要想通了,就沒有什麼問題 幾乎是純數學分析 我們考慮對稱性,可以計算右下角的三角形的圖形中的點數。 再縱向觀察,查詢規律,就可看出對於第i列,可以看見的點有euler(i-1) 所以累加就好了,然後乘2加一,就ok了 怎麼分析,明年再說。 程式碼如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
int prime[40005];
void getprime(){
	memset(prime,0,sizeof(prime)
); for(int i=2;i<=40000;i++){ if(prime[i]==0){ for(int j=i*2;j<=40000;j+=i){ prime[j]=1; } } } } int euler(int m){ int ans=m; for(int i=2;i<=m;i++){ if(m%i==0){ ans*=(i-1); ans/=i; while(m%i==0){ m/=i; } } } return ans; } int main(){ scanf("%d",&n); if(n==1)
{ printf("0"); return 0; } int ans=0; getprime(); for(int i=1;i<n;i++){ ans+=euler(i); } ans*=2; ans++; printf("%d",ans); return 0; }