8.7-Day1T1
题目大意:
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的更多相关文章
- 洛谷P1003 铺地毯 noip2011提高组day1T1
洛谷P1003 铺地毯 noip2011提高组day1T1 洛谷原题 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n ...
- 洛谷p1216 IOI1994 Day1T1
洛谷p1216 IOI1994 Day1T1 洛谷原题 题目描述 观察下面的数字金字塔. 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大.每一步可以走到左下方的点也可以到达右下 ...
- NOI Day1T1归程(Kruskal重构树+Dijkstra)
NOI Day1T1归程(Kruskal重构树+Dijkstra) 题目 洛谷题目传送门 题解 其实我不想写......,所以...... 挖个坑......我以后一定会补的 luogu的题解讲的还是 ...
- 洛谷P1003 [NOIP2011提高组Day1T1]铺地毯
P1003 铺地毯 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号 ...
- luogu1097统计数字[noip2007提高组Day1T1]
题目描述 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*10^9).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出 ...
- NOI2014 起床困难综合症 day1t1
感觉NOI题在向简单方向发展,或者说明年会难到暴呢? 直接模拟啊,枚举每个二进制数位,看经过变换之后是否为1及为1的条件即可.\( O(nlogm)\). 然后...跪了一个点,第五个死活比标准大一. ...
- ZROI2018普转提day1t1
传送门 分析 我们先二分一下最终的平均值mid,然后让序列中的每一个数都减去这个mid,之后用新序列的前缀和建一棵线段树,枚举起点i,然后求出此时在i+L-1~i+R-1范围内的前缀和的最大值,用这个 ...
- noi.ac day1t1 candy
传送门 分析 我们知道如果设A,B分别为将两家店从大到小排序之后各自的前缀和,则 Ans=Max{Min{A[i],B[j]}-W*(i+j)}. 为了得到这个Ans我们可以枚举两个数的Min,然后剩 ...
- ZROI2018提高day1t1
传送门 分析 在考场上我通过画图发现了对于n个点肯定用一个六边形围起来最优(假装四边形是特殊的六边形),我们发现可以将这个六边形分成两个梯形(梯形的高可以为0),然后我们便枚举两个梯形共同的底边和它们 ...
- 【扬中集训DAY1T1】 微信群
[题目链接] 点击打开链接 [算法] 对问题稍加分析后,发现其实要求的就是 : C(N,K) + C(N,K+1) + C(N,K+2) + ... + C(N,N) 因为N最大10^9,K最大10^ ...
随机推荐
- 849. Dijkstra求最短路 I(模板)
给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1. 输入格式 第一行包含整数n和m. 接下来m行每行包 ...
- flutter loading
在发起请求时 需要有loading页面这样可以让用户知道当前正在操作,又可以防止多次点击等误操作,所以这里就自定义了一个loading页面 菊花使用flutter_spinkit里面的菊花来代替 在需 ...
- Nginx实现前端访问后端本地接口
Nginx配置两个地方就行: 先是配置好自己项目的服务,确保自己的项目能运行: location / { root /web/xiangmu/public; // 本地项目的路径 index inde ...
- C++-POJ2960-S-Nim-[限制型Nim]
每次只能从取集合S中个数的物品,其他和普通Nim游戏相同 预处理出每种物品堆的sg值,然后直接xor一下,xor-sum>0即必胜 #include <set> #include & ...
- go语言 实现对称加密解密算法
package main import ( "bytes" "crypto/aes" "crypto/cipher" "crypt ...
- 题解【Codeforces859C】Pie Rules
题面 一道需要一定思考的 \(\text{DP}\) . 设 \(dp_i\) 表示第 \(i\) 步走的人能得到的最大分数, \(sum_i\) 表示 \(\sum_{j=i}^n a_j\) ,即 ...
- K-NN graph
tasks: 1. unsupervised knn https://scikit-learn.org/stable/modules/neighbors.html#unsupervised-neigh ...
- 解决使用git出现 The file will have its original line endings in your working directory
执行以下命令即可解决 git rm -r --cached . git config core.autocrlf false git add . . 代表当前目录
- LitElement(三)Styles样式
1.为组件添加样式 import { LitElement, css, html } from 'lit-element'; class MyElement extends LitElement { ...
- element 表格里的input点击回车聚焦下个input
<template> <card> <el-table ref="singleTable" :data="tableData" h ...