BZOJ 2190: [SDOI2008]仪仗队

Posted You Siki

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 2190: [SDOI2008]仪仗队相关的知识,希望对你有一定的参考价值。

2190: [SDOI2008]仪仗队

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 2717  Solved: 1731
[Submit][Status][Discuss]

Description

  作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。    技术分享   现在,C君希望你告诉他队伍整齐时能看到的学生人数。

Input

  共一个数N。

Output

  共一个数,即C君应看到的学生人数。

Sample Input

  4

Sample Output

  9


HINT

 

【数据规模和约定】   对于 100% 的数据,1 ≤ N ≤ 40000

 

Source

 
[Submit][Status][Discuss]

 

看到之后觉得就是对phi的求和,不相信数据范围会给这么小(明明是O(N)的算法好嘛,给个40000的N是什么心态)。注意特判就好,据说需要unsigned long long……

 

 1 #include <bits/stdc++.h>
 2 typedef unsigned long long ull;
 3 const int siz = 40005;
 4 int n, pri[siz], isp[siz], tot; ull phi[siz];
 5 signed main(void) {
 6     scanf("%d", &n);
 7     for (int i = 2; i <= n; ++i) {
 8         if (!isp[i])pri[tot++] = i, phi[i] = i - 1;
 9         for (int j = 0; j < tot; ++j) {
10             if (i * pri[j] > n)break;
11             isp[i * pri[j]] = 1;
12             if (i % pri[j])
13                 phi[i * pri[j]] = phi[i] * (pri[j] - 1);
14             else {
15                 phi[i * pri[j]] = phi[i] * pri[j]; break; }
16         }
17     }
18     ull ans = 2;
19     for (int i = 2; i < n; ++i)
20         ans += phi[i];
21     (ans <<= 1) -= 1;
22     std::cout << (n > 1 ? ans : 0) << std::endl;
23 }

 

@Author: YouSiki

 

以上是关于BZOJ 2190: [SDOI2008]仪仗队的主要内容,如果未能解决你的问题,请参考以下文章

bzoj2190 [SDOI2008]仪仗队

bzoj 2190: [SDOI2008]仪仗队

BZOJ-2190: [SDOI2008]仪仗队 (欧拉函数)

bzoj 2190 [SDOI2008]仪仗队

bzoj2190 [SDOI2008]仪仗队(欧拉函数)

BZOJ-2190: [SDOI2008]仪仗队 (欧拉函数)