BZOJ2190 SDOI2008 仪仗队

这题目一看数学色彩就很浓

通过观察图(这个。。)我们就可以发现,如果按对角线剖分的话,两边可以看到的学生数都恰好是1~n-1范围内的互质数对数,即sigma(phi(i))

phi就是欧拉函数,关于线性求欧拉函数可以点这里:

http://blog.csdn.net/ji414341055/article/details/5771066

那么这题就基本已经解决了,答案就是1~n-1的欧拉函数和*2-1,需要注意的还有两个地方:开unsigned long long和特判n<2的情况

Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#define ll long long
#define ull unsigned long long
 
using namespace std;
 
bool f[40001];
ull p[40001];
ull ans[40001];
 
int main(){
    int n,tot=0;
    cin >>n;
    if (n<=1){
        cout <<0 <<endl;
        return 0;
    }
    memset(f,false,sizeof(f));
    f[1]=true;
    for (int i=2;i<=n;i++){
        if (!f[i]){
            p[++tot]=i;
            ans[i]=i-1;
        }
        for (int j=1;(j<=tot)&&(i*p[j]<=n);j++){
            f[i*p[j]]=true;
            if (i%p[j]==0){
                    ans[i*p[j]]=ans[i]*p[j];
                    break;
            }
            else{
                ans[i*p[j]]=ans[i]*(p[j]-1);
            }
        }
    }
    long long pr=2;
    for (int i=2;i<=n-1;i++) pr+=ans[i];
    cout <<pr*2-1 <<endl;
    return 0;
}

 

posted @   JS_Shining  阅读(1275)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示