首页 > 代码库 > BZOJ 2190: [SDOI2008]仪仗队
BZOJ 2190: [SDOI2008]仪仗队
2190: [SDOI2008]仪仗队
Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 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
看到之后觉得就是对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]仪仗队
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。