题目大意:

T组测试数据,每组测试数据给出一个n,求[0,n-1]所有逆元的和。(n可能不为质数)

题解:

我的想法:

求出每一个数的逆元,再相加。由于有n为质数的时候,所以,我将它分为两种情况:(1)n为质数是,线性求逆元(2)n不为质数时,扩展欧几里得求逆元

理论上可以拿个60分的...但我数组开大了,,,文件直接不可运行了...爆零...

正解:

算法1:

当n是质数的时候,所有数都有质数,直接输出n * (n - 1) / 2;

算法2:

当n不是质数的时候,判断一下逆元是否存在,然后累加即可;

判断存在用 gcd(i,n)=1 就可以, O(logn);

求逆元可以利用扩展欧几里得求逆元,O(logn)

算法3:

这道题有两个性质:

性质 1:集合{[0,n-1]中存在逆元的数}==集合{[0,n-1]中存在逆元的数的逆元}

性质 2:[0,n-1]中与互质的数的和为 n*(n)/2 ;

性质 1 的正确性:

因为对逆元再求逆元得到的是本身,它们就是一一对应的了;

这样问题就转化成了求[0,n-1]中与 n 互质的数的和;

性质 2 是因为 gcd(n,i)=gcd(n,n-i);

所以与 n 互质的数可以关于 n/2 对称的,也就是相加等于 n;

那答案为 n*(n)/2 也是显然了;

复杂度为求欧拉的复杂度,O( sqrt(n) );

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#define ll long long
using namespace std;
inline int read()
{
int sum = , p = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-')
p = -;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
(sum *= ) += ch - '';
ch = getchar();
}
return sum * p;
}
int phi(int x)
{
int cnt = x;
for(int i = ; i * i <= x; i++)
{
if(x % i == )
{
cnt /= i;
cnt *= i - ;
while(x % i == )
x /= i;
}
}
if(x != )
cnt /= x,cnt *= x - ;
return cnt;
} int main()
{
int n;
int t = read();
while(t--)
{
n = read();
printf("%lld\n",(ll)n * phi(n) / );
}
return ;
}

8.7-Day1T1的更多相关文章

  1. 洛谷P1003 铺地毯 noip2011提高组day1T1

    洛谷P1003 铺地毯 noip2011提高组day1T1 洛谷原题 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n ...

  2. 洛谷p1216 IOI1994 Day1T1

    洛谷p1216 IOI1994 Day1T1 洛谷原题 题目描述 观察下面的数字金字塔. 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大.每一步可以走到左下方的点也可以到达右下 ...

  3. NOI Day1T1归程(Kruskal重构树+Dijkstra)

    NOI Day1T1归程(Kruskal重构树+Dijkstra) 题目 洛谷题目传送门 题解 其实我不想写......,所以...... 挖个坑......我以后一定会补的 luogu的题解讲的还是 ...

  4. 洛谷P1003 [NOIP2011提高组Day1T1]铺地毯

    P1003 铺地毯 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号 ...

  5. luogu1097统计数字[noip2007提高组Day1T1]

    题目描述 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*10^9).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出 ...

  6. NOI2014 起床困难综合症 day1t1

    感觉NOI题在向简单方向发展,或者说明年会难到暴呢? 直接模拟啊,枚举每个二进制数位,看经过变换之后是否为1及为1的条件即可.\( O(nlogm)\). 然后...跪了一个点,第五个死活比标准大一. ...

  7. ZROI2018普转提day1t1

    传送门 分析 我们先二分一下最终的平均值mid,然后让序列中的每一个数都减去这个mid,之后用新序列的前缀和建一棵线段树,枚举起点i,然后求出此时在i+L-1~i+R-1范围内的前缀和的最大值,用这个 ...

  8. noi.ac day1t1 candy

    传送门 分析 我们知道如果设A,B分别为将两家店从大到小排序之后各自的前缀和,则 Ans=Max{Min{A[i],B[j]}-W*(i+j)}. 为了得到这个Ans我们可以枚举两个数的Min,然后剩 ...

  9. ZROI2018提高day1t1

    传送门 分析 在考场上我通过画图发现了对于n个点肯定用一个六边形围起来最优(假装四边形是特殊的六边形),我们发现可以将这个六边形分成两个梯形(梯形的高可以为0),然后我们便枚举两个梯形共同的底边和它们 ...

  10. 【扬中集训DAY1T1】 微信群

    [题目链接] 点击打开链接 [算法] 对问题稍加分析后,发现其实要求的就是 : C(N,K) + C(N,K+1) + C(N,K+2) + ... + C(N,N) 因为N最大10^9,K最大10^ ...

随机推荐

  1. canvas-文字粒子化(小程序)

    有2张画板,1张渲染文字为获取文字数组,另一张用来渲染粒子根据拿到的数组. step1:渲染文字,根据canvasGetImageData拿到rgba数组 step2:遍历rgba数组拿到粒子的坐标 ...

  2. Linux的VMware虚拟机无法上网问题

    很多时候,Linux无法上网,不管改成nat模式还是主机模式都不行.这时候可以选择进行重置: 首先点击编辑,之后点击虚拟网络编辑器, 然后移除VMnet0和VMnet8网络,点击确定: 然后再打开虚拟 ...

  3. java注释英语自动机翻

    一.简介 每次面试都被怼spring源码你看过吗?你用spring开发源码你都不看的吗?这样怎么开发?那我就下点决心,趁着现在疫情在家宅,我要看spring源代码.但是发现注释都是英文,勉勉强强能看懂 ...

  4. (转)git fetch + merge 和 git pull 的区别

    转自:http://blog.csdn.net/a19881029/article/details/42245955 Git fetch和git pull都可以用来更新本地库,它们之间有什么区别呢? ...

  5. Docker镜像加速-配置阿里云镜像仓库

    Docker默认远程仓库是https://hub.docker.com/ 比如我们下载一个大点的东西,龟速 由于是国外主机,类似Maven仓库,慢得一腿,经常延迟,破损: 所以我们一般都是配置国内镜像 ...

  6. 从零DIY机械键盘/主控方案

    自从有了第一套机械键盘,先后修改了接口方案,安装了LED灯等,但是始终无法满足自己的DIY欲望. 于是想到最简单的方法就是用现成的主控,而主控来源于废弃的键盘,如下图: 这种主控也是矩阵方式,只需要测 ...

  7. 2020牛客寒假算法基础集训营1 J. 缪斯的影响力 (矩阵快速幂/费马小定理降幂)

    https://ac.nowcoder.com/acm/problem/200658 f(n) = f(n-1) * f(n-2) * ab ,f的第一项是x,第二项是y. 试着推出第三项是x·y·a ...

  8. IDEA配置tomcat日志乱码

    第一步(tomcat7/8) tomcat:找到tomcat文件夹下的conf文件夹,去修改里面的logging.properties文件 两种修改方式(第一种方法不行再用第二种): 将文件中的5个U ...

  9. 马走日的解法(dfs)

    马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. Input 第一行为整数T ...

  10. 洛谷P1372 又是毕业季I

    https://www.luogu.org/problem/P1372 #include<bits/stdc++.h> using namespace std; long long n,k ...