bzoj2190 [SDOI2008]仪仗队

2190: [SDOI2008]仪仗队

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 3353  Solved: 2168
[Submit][Status][Discuss]

Description

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

Input

  共一个数N。

Output

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

Sample Input

  4

Sample Output

  9

HINT

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

分析:如果以C君所在的点为原点来建立坐标系,那么只有x,y互素才能被看到,否则就会被(x / gcd(x,y),y / gcd(x,y))挡住,计算互素的数的对数的经典做法就是利用欧拉函数,记录1~i与i互素的点的个数然后*2就好了,在这道题里我们求出∑φ(i) (2 <= i < n) ,答案*2+3就好了(还有0,1  1,0  1 1这三个点).

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

int n,ans,phi[40010];

void getphi()
{
    phi[1] = 1;
    for (int i = 2; i <= n; i++)
    if (!phi[i])
    for (int j = i; j <= n; j+=i)
    {
        if (!phi[j])
        phi[j] = j;
        phi[j] = phi[j] / i * (i - 1);
    }
}

int main()
{
    scanf("%d",&n);
    getphi();
    for (int i = 2; i < n; i++)
    ans += phi[i];
    printf("%d\n",ans * 2 + 3);

    return 0;
}
时间: 2025-01-12 00:00:09

bzoj2190 [SDOI2008]仪仗队的相关文章

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

2190: [SDOI2008]仪仗队 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 3203  Solved: 2062[Submit][Status][Discuss] Description 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图).    现在,C君希望你告诉他队伍整齐时能看到的学生人数.

欧拉函数 BZOJ2190 [SDOI2008] 仪仗队

2190: [SDOI2008]仪仗队 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 3165  Solved: 2036[Submit][Status][Discuss] Description 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图). 现在,C君希望你告诉他队伍整齐时能看到的学生人数. In

素数筛&amp;&amp;欧拉筛 BZOJ2818 Gcd BZOJ2190 [SDOI2008]仪仗队

折腾了一晚上很水的数论,整个人都萌萌哒 主要看了欧拉筛和素数筛的O(n)的算法 这个比那个一长串英文名的算法的优势在于没有多次计算一个数,也就是说一个数只筛了一次,主要是在%==0之后跳出实现的,具体的解释看的迷迷糊糊,特别是欧拉函数的求解 http://blog.csdn.net/lerenceray/article/details/12420725 代码如下 1 void ES(){ 2 for(int i=2;i<n;i++){ 3 if (!pd[i]){ 4 prime[++top]=

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

与HDU2841大同小异. 设左下角的点为(1,1),如果(1,1)->(x,y)和(1,1)->(x',y')向量平行,那只有在前面的能被看见.然后就是求x-1.y-1不互质的数对个数. 而x或y等于1可以另外讨论一下,就是当n不等于1时就有两个,n等于1就特判一下. 那么就用欧拉函数计数了:枚举x-1,累加小于x-1与x-1互质的个数,即合法的y-1的个数:结果还要*2,因为还有一半对称的y-1>x-1的情况:此外x-1=y-1多算了一次,减去1即可. 1 #include<c

BZOJ2190 SDOI2008 仪仗队 gcd,欧拉函数

题意:求从左下角能看到的元素个数 引理:对点(x,y),连线(0,0)-(x,y),元素个数为gcd(x,y)-1(中间元素) 即要求gcd(x,y)=1 求gcd(x,y)=1的个数 转化为2 \sum_(i=1)^(n-1) \phi(i) - 1 (思考如何转化) 感性分析,理性计算 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int n,phi[100005]; 5 6 int main(){ 7 cin>>n

bzoj 2190: [SDOI2008]仪仗队.

2190: [SDOI2008]仪仗队 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 3240  Solved: 2092[Submit][Status][Discuss] Description 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图).现在,C君希望你告诉他队伍整齐时能看到的学生人数. Inp

SDOI2008仪仗队

这题应该注意到与b2818的不同 一个点能被看见当且仅当它与(1,1)的横纵坐标的距离gcd为1 所以问题转化为x,y<=n-1,求gcd(x,y)=1的方案数 最后要加上2 代码: 1 var i,n,tot:longint; 2 ans:int64; 3 phi:array[0..50000] of int64; 4 p:array[0..50000] of longint; 5 procedure get; 6 var i,j:longint; 7 begin 8 fillchar(phi

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

2190: [SDOI2008]仪仗队 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 3235  Solved: 2089 Description 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图).    现在,C君希望你告诉他队伍整齐时能看到的学生人数. Input 共一个数N. Output 共一个数

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

假设C君为(0, 0), 则右上方为(n - 1, n - 1). 一个点(x, y) 能被看到的前提是gcd(x, y) = 1, 所以 answer = ∑ phi(i) * 2 + 2 - 1 = ∑phi(i) * 2 + 1 ( 1 <= i < n ). +2是因为(1, 0), (0, 1) 两个点, -1是因为(1, 1)重复计算了 -------------------------------------------------------------------------