儀仗隊(SDOI2008)
阿新 • • 發佈:2018-12-16
看輸入輸出就很簡單。 事實上只要想通了,就沒有什麼問題 幾乎是純數學分析 我們考慮對稱性,可以計算右下角的三角形的圖形中的點數。 再縱向觀察,查詢規律,就可看出對於第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;
}