• 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

  • 相关阅读:
    2016/9/18结对编程之需求分析与原型设计。
    K米评测
    软件工程的实践项目课程的自我目标
    url学习1
    调研构建之法指导下的作品
    初次尝试对接
    第二次结对编程作业——毕业导师智能匹配
    uml
    Qt中采用cairo将图片导出至PDF
    SQL删除重复的记录(只保留一条)
  • 原文地址:https://www.cnblogs.com/yousiki/p/6269991.html
Copyright © 2020-2023  润新知