今天早上你谷崩了

由于脑子抽筋,所以选了一道数学题来做。做着做着就疯了

传送

窝盟先画张图冷静冷静

这是样例的图,其中蓝点是有学生的地方。

窝盟来看一下那些学生可以被C君看到。

假设这张图是一个坐标系,C君在(0,0)。

C君可以看到的学生:(1,0),(0,1),(1,1),(1,2),(2,1),(1,3),(3,1),(2,3),(3,2)

我们画下来(下图中红点是可以看到的学生)

我们发现红点的横纵坐标的最大公约数都是1,且所有红点关于y=x对称。

所以我们可以求出来一半的红点,再*2-1(因为(1,1)关于y=x对称后还是(1,1),所以要-1)

我们再看一下数据范围:

显然O(n2)枚举横纵坐标会TLE。

我们发现对于合法的点(i,j)来说,gcd(i,j)=1,也就是说i与j互质。所以我们要找出所有符合(i,j)互质的二元组(i,j)。

仔细思考,想起有一个神奇的函数,叫欧拉函数。φ(n)是求从1到n-1中,有多少个与n互质的数。

为了不重复,不少求符合条件的(i,j),我们求出1到n-1这些数的φ,然后乘2.

似乎少求了什么东西。是什么呢?是什么呢?是什么呢?

我们好像忽略了(1,0)和(0,1)这两个点,还把(1,1)算了两遍

那就在当前答案上直接+1好了

怎么快速求φ?

我们先看几个式子:

若n,m互质,φ(nm)=φ(n)φ(m)

p为质数,φ(p)=p-1;

通向公式:φ(n)=n(1-1/p1)(1-1/p2).....(1-1/pk)  (其中p1,p2...pk为n的所有质因子)

所以φ(n)=n/pi*(pi-1) (1<=i<=k)

以下是求φ的代码:

int phi(int k)
{
if(k==)return ;
if(!no[k])return k-;
cn=;
int p=k,h=k;
for(int i=;i*i<=k;i++)
{
if(h%i==)
{
p=p/i*(i-);//上面的推导
h/=i;
while(h%i==)
h/=i;//我们只用到不同的质因数
} }
if(h>) p=p/h*(h-);//如果此时的h是最后一个质因数,还要更新p
return p;
}

但是有一个特殊情况:n=1。

按照我们的思路,最后答案会是1,因为在n≠1时,加上了(1,0),(0,1),减去了多余的(1,1),所以答案+1,但是当n=1时,只有C君,没有学生,所以答案是0.

本题代码

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define ll long long
using namespace std;
int n,pre[],cnt,all,cn,ys[];
bool no[];
int read()
{
char ch=getchar();
int x=;bool f;
while(ch<''||ch>'')
{
if(ch=='-')f=;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=(x<<)+(x<<)+(ch^);
ch=getchar();
}
return f?-x:x;
}
int phi(int k)
{
if(k==)return ;
if(!no[k])return k-;
cn=;
int p=k,h=k;
for(int i=;i*i<=k;i++)
{
if(h%i==)
{
p=p/i*(i-);
h/=i;
while(h%i==)
h/=i;
} }
if(h>) p=p/h*(h-);
return p;
}
int main()
{
n=read();
if(n==)//注意特判
{
printf("");return ;
}
all=;
for(int i=;i<=n;i++)
{
if(!no[i])
pre[++cnt]=i;
for(int j=;j<=cnt;j++)
{
if(i*pre[j]>n)break;
no[i*pre[j]]=;
if(i%pre[j]==)
break;
}
}
no[]=;
for(int i=;i<=n-;i++)
{
all+=phi(i);
}
all*=;
all+=;
printf("%d",all);
}

P2158仪仗队的更多相关文章

  1. 洛谷 - P2158 - 仪仗队 - 欧拉函数

    https://www.luogu.org/problemnew/show/P2158 好像以前有个妹子收割铲也是欧拉函数. 因为格点直线上的点,dx与dy的gcd相同,画个图就觉得是欧拉函数.但是要 ...

  2. Luogu P2158 仪仗队 题解报告

    题目传送门 [题目大意] 给定一个n×n的点方阵,求站在左下角的点能看到的点数 注意同一条直线上只能看到一个点 [思路分析] 因为是一个方阵,所以可以对称地算,那么对于半个方阵,这里假设是左上的半个方 ...

  3. 欧拉筛,线性筛,洛谷P2158仪仗队

    题目 首先我们先把题目分析一下. emmmm,这应该是一个找规律,应该可以打表,然后我们再分析一下图片,发现如果这个点可以被看到,那它的横坐标和纵坐标应该互质,而互质的条件就是它的横坐标和纵坐标的最大 ...

  4. 洛谷 P2158 仪仗队

    欧拉函数入门题... 当然如果有兴趣也可以用反演做...类似这题 题意就是求,方阵从左下角出发能看到多少个点. 从0开始给坐标 发现一个点能被看到,那么横纵坐标互质. 然后求欧拉函数的前缀和,* 2 ...

  5. 【Luogu】P2158仪仗队(欧拉函数)

    题目链接 首先来介绍欧拉函数. 设欧拉函数为f(n),则f(n)=1~n中与n互质的数的个数. 欧拉函数有三条引论: 1.若n为素数,则f(n)=n-1; 2.若n为pa,则f(n)=(p-1)*(p ...

  6. P2158 [SDOI2008]仪仗队

    P2158 [SDOI2008]仪仗队图是关于y=x对称的,横纵坐标一定是互质的否则在之前就被扫过了,所以就可以用欧拉函数再*2就完了. #include<iostream> #inclu ...

  7. 洛谷 P2158 [SDOI2008]仪仗队 解题报告

    P2158 [SDOI2008]仪仗队 题目描述 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线 ...

  8. P2158/bzoj2190 [SDOI2008]仪仗队

    P2158 [SDOI2008]仪仗队 欧拉函数 计算下三角的点数再*2+1 观察斜率,自行体会 #include<iostream> #include<cstdio> #in ...

  9. P2158 [SDOI2008]仪仗队 && 欧拉函数

    P2158 [SDOI2008]仪仗队 题目描述 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线 ...

随机推荐

  1. [Python3 填坑] 018 组装类的几个例子

    目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 MetaClass 举例 2.2 type 举例 2.3 MetaClass 举例 1. print( 坑的信息 ) 挖坑时间:2019 ...

  2. Elasticsearch7.X 入门学习第五课笔记---- - Mapping设定介绍

    原文:Elasticsearch7.X 入门学习第五课笔记---- - Mapping设定介绍 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本 ...

  3. 安装kali linux 后出现文字乱码问题

    在安装kali时我选择中文安装,结果安装完成后出现文字乱码现象 在经过上网查询后,采用了CSDN博客站中的 stubbornness1219 这位博主的解决方案成功将问题解决. 解决方案:终端下执行s ...

  4. ps:界面概览

    首先我们来认识一下Photoshop的界面组成,如下图是一个典型的界面.为了方便识别,我们加上了颜色和数字. 1:顶部的红色区域是菜单栏,包括色彩调整之类的命令都存放在从菜单栏中.在我们的教程中使用[ ...

  5. CSP-S2019 赛前补题

    前言 该打的比赛也打完了,每一场打得并不是很理想,所以就没写赛后总结了.最后再把每一场的比赛补一下,也算给自己一个交代吧. 牛客CSP-S提高组赛前集训营6 考试 100 + 30 + 0 = 130 ...

  6. Car的旅行路线(Floyd+模拟)

    题目地址 贼鸡儿猥琐的一道题 好在数据不毒瘤,而且Floyd就OK了. 这道题的难点在于 建图,也很考验模拟能力,需要十分的有耐心. 建图 题目中告诉了我们一个矩形的三个点 我们在平面直角坐标系中随便 ...

  7. fastjson合并json数组中相同的某个元素

    /** * @param array JSON数组 * @param array 需合并后的某个元素名 */ private static JSONArray mgreArray(JSONArray ...

  8. .OnCommand mfc

    .OnCommand是响应WM_COMMAND消息的,一般是响应控件和菜单的命令消息时使用. 如果 WM_COMMAND 来自控件的话 lParam 就是发送这个 WM_COMMAND 消息的控件的句 ...

  9. 【XSY2472】string

    题目 Description 输入文件: string.in 输出文件: string.out 给定一个由且仅由字符 'H' , 'T' 构成的字符串 \(S\) . 给定一个最初为空的字符串 \(T ...

  10. vue+java后台通信报403,cors解决跨域问题(该贴说的不是很清楚,不过大概如此,可再去网上查相关内容)

    前端是vue2.0,网络请求用的是axios,后端是springboot2.0 用axios向后端发送post请求,结果得到一个403无权限的错误,莫名其妙啊,我明明发送的是post请,但在chrom ...