关于gcd的四道题
T1:
题目描述:
给定一个n求\(\sum\limits_{i=1}^ngcd(i,n)\)
因为n太大,所以O(n)的做法肯定不行,然后就去想根号的方法。
\]
\]
\]
\]
\]
然后i从1到\(\sqrt{n}\)去枚举n的因数,然后将i*φ(n/i)与n/i与φ(i)全部计入答案,就可以做到\(\sqrt{n}*\sqrt{n}\)的复杂度,因为第二个根号是求欧拉函数的复杂度,所以实际的复杂度没有这么高
代码:
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
ll phi(ll x)
{
ll ans=1;
for(ll i=2;i*i<=x;++i)
{
if(x%i==0)
{
ans*=(i-1);
x/=i;
}
while(x%i==0)
{
ans*=i;
x/=i;
}
}
if(x!=1)
ans*=(x-1);
return ans;
}
int main()
{
ios::sync_with_stdio(false);
ll n;
cin>>n;
ll ans=0;
ll i;
for(i=1;i*i<=n;++i)
if(n%i==0)
ans+=i*phi(n/i)+(n/i)*phi(i);
if(i*i==n) ans-=i*phi(i);
cout<<ans;
return 0;
}
T2:
exbzoj2705:
没有评测,
题目描述:
给定一个整数n(1<=n<=100000),你需要求出\(\sum\limits_{i=1}^n\sum\limits_{j=1}^igcd(i,j)\)
暴力做法:将上个题中的n循环起来,最后记录每个循环所求的和。明显TLE
正解:
\]
枚举因数k
\]
考虑所有最大公因数为k的情况,设\(i=ak,j=bk(a>=b)\)若要i与j做大公约数为k,则必须满足gcd(a,b)=1,满足此条件的所有情况数为φ(b),然后考虑b的取值范围,因为必须满足b*k<=n,所以\(b<=[\frac{n}{k}]\)。所以答案为
\]
所以线性求出欧拉函数,并求出前缀和即可。
代码:
#include<cstdio>
#include<iostream>
using namespace std;
const int N=100000+100;
int phi[N],phi_sum[N];
void getphi()
{
for(int i=1;i<N;++i)
phi[i]=i;
phi[1]=1;
for(int i=2;i<N;++i)
if(phi[i]==i)
for(int j=i;j<=N;j+=i)
phi[j]=phi[j]/i*(i-1);
for(int i=1;i<N;++i)
phi_sum[i]=phi_sum[i-1]+phi[i];
}
int n;
int main()
{
getphi();
while(1)
{
scanf("%d",&n);
if(!n) break;
long long ans=0;
for(int i=1;i<=n;++i)
ans+=phi_sum[n/i]*i;
cout<<ans<<endl;
}
return 0;
}
T3:
别问我为什么是luogu
题目描述:
给定一个整数n(1<=n<=100000),求\(\sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^ngcd(i,j)\)
解法:
\]
枚举因数k
\]
考虑所有最大公因数为k的情况,设\(i=ak,j=bk(b>a)\)若要i与j做大公约数为k,则必须满足gcd(a,b)=1,满足此条件的所有情况数为φ(b),然后考虑b的取值范围,因为必须满足b*k<=n,所以\(b<=[\frac{n}{k}]\)。所以答案为
\]
所以线性求出欧拉函数,并求出前缀和即可。
为什么和上面一样
但是因为i和j都不能为0并且j>i即b>a,所以b不能为1,所以要在最后减去φ(1)的情况,也就相当于把里面的i从2开始枚举。
所以最终答案为
\]
代码:
#include<cstdio>
#include<iostream>
using namespace std;
const int N=100000+100;
int phi[N],phi_sum[N];
void getphi()
{
for(int i=1;i<N;++i)
phi[i]=i;
phi[1]=1;
for(int i=2;i<N;++i)
if(phi[i]==i)
for(int j=i;j<=N;j+=i)
phi[j]=phi[j]/i*(i-1);
for(int i=1;i<N;++i)
phi_sum[i]=phi_sum[i-1]+phi[i];
}
int n;
int main()
{
getphi();
while(1)
{
scanf("%d",&n);
if(!n) break;
long long ans=0;
for(int i=1;i<=n;++i)
ans+=(phi_sum[n/i]-1)*i;
cout<<ans<<endl;
}
return 0;
}
T4:
题目描述:
给定一个n(1<=n<=100000),求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^ngcd(i,j)\)
解法:
发现这个题数上面两个题的综合,所以,嘿嘿,将上面的两个题答案加起来即可,所以最终答案为
\]
代码:
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
const int N=100000+100;
ll ans,phi[N],phi_sum[N],n;
void getphi()
{
for(int i=1;i<N;++i)
phi[i]=i;
phi[1]=1;
for(int i=2;i<N;++i)
if(phi[i]==i)
for(int j=i;j<=N;j+=i)
phi[j]=phi[j]/i*(i-1);
for(int i=1;i<N;++i)
phi_sum[i]=phi_sum[i-1]+phi[i];
}
int main()
{
cin>>n;
getphi();
for(int i=1;i<=n;++i)
ans+=(phi_sum[n/i]*2-1)*i;
cout<<ans;
return 0;
}
关于gcd的四道题的更多相关文章
- DDCTF2019 的四道题wp
MIsc:流量分析 这道题,在比赛的时候就差个key了,但是没想到要改高度,后来群里师傅说了下,就再试试, 导出来改高度. 导出来,把 把%5c(4)前面的hex删掉,改成png,就直接拿去那个img ...
- lintcode中等题目的四道题
第一题: 第一句先创建了一个解决问题的类, 第二句声明了一个公共接口的整形链表里面有N个整形数, 第三句给链表动态初始化, 第四步判断链表里的数有没有,如果N<=0则返回结果0,否则执行Prin ...
- 深入GCD(四):使用串行队列实现简单的预加载
其主要思路是使用gcd创建串行队列,然后在此队列中先后执行两个任务:1.预加载一个viewController 2.将这个viewController推入代码如下:@implementation DW ...
- lintcode 四道题
我们考虑对每个字符进行两边扩展,寻找回文串,并记录长度.有两种情况,一种是bab,从a向两边扩展,一种abba,从bb中间向两边扩展. dp[i][j] 表示子串s[i-j]是否是回文 初始化:dp[ ...
- google Kickstart Round F 2017 四道题题解
Problem A. Kicksort 题意抽象一下为: 对于一个每次都从数列正中间取划分数的快速排序,给定一个1-n的排列,问快排的复杂度对于这个排列是否会退化为最坏复杂度. 数据范围: 测试组数1 ...
- GCD 学习(四) dispatch_group
如果想在dispatch_queue中所有的任务执行完成后在做某种操作,在串行队列中,可以把该操作放到最后一个任务执行完成后继续,但是在并行队列中怎么做呢.这就有dispatch_group 成组操作 ...
- GCD 扫盲篇
GCD有四个概念:串行队列.并行队列.同步.异步四者. 如下简介: 这里不仅给出了不确定性,而且也给出了确定性.对于初学者而言,有时候因为那些不确定的东西所造成的疑问会像没有闸却在疾驰的汽车一样让人惊 ...
- NOIP2012普及组 (四年后的)解题报告 -SilverN
本章施工仍未完成 现在的时间是3.17 0:28,我困得要死 本来今天(昨天?)晚上的计划是把整个四道题的题解写出来,但是到现在还没写完T4的高效算法,简直悲伤. 尝试了用floyd写T4,终于大功告 ...
- ACM第四次积分赛
虽然因为第一题给的数据有问题,没能四道题都做出来,但是这次第四名,进步很大,继续努力! SAU-ACM总比赛成绩 姓名 账号 上学期成绩 第一次成绩 第二次成绩 第三次成绩 第四 ...
随机推荐
- Spring MVC深入学习
一.MVC思想 MVC思想简介: MVC并不是java所特有的设计思想,也不是Web应用所特有的思想,它是所有面向对象程序设计语言都应该遵守的规范:MVC思想将一个应用部分分成三个基本部 ...
- nginx系列6:nginx的进程结构
nginx的进程结构 如下图: 通过ps –ef | grep nginx可以看到共有三个进程,一个master进程,两个worker进程. nginx是多进程结构,多进程结构设计是为了保证nginx ...
- google zxing android扫描优化&解析
这里先给出zxing包的源码地址 zip包:https://codeload.github.com/zxing/zxing/zip/master Github:https://github.com/z ...
- 小米平板6.0系统如何无ROOT激活xposed框架的步骤
在较多企业的引流,或业务操作中,基本上都需要使用安卓的黑高科技术Xposed框架,近期,我们企业购买了一批新的小米平板6.0系统,基本上都都是基于7.0以上系统,基本上都不能够获得ROOT的su权限, ...
- JMeter 接口测试-if控制器
JMeter 接口测试-if控制器 使用场景: 当业务场景是用户登录才能支付操作, 不登录点击支付, 页面会跳转到登录页面. 对于接口也是这样, 一个接口需要执行前, 需要有前提条件, 比如0状态 ...
- python带参函数(计算器脚本解释标注)
环境 python 3.* def operator(op1,op2,opfu): #定义符号函数,op1表示第一个运算数值,op2表示第二个,opfu表示运算符号 if opfu not in '+ ...
- block的注意点
1). 在block内部使用外部指针且会造成循环引用情况下,需要用__week修饰外部指针: __weak typeof(self) weakSelf = self; 2). 在block内部如果调用 ...
- idea右键无法生成javaclass
博客转自:https://www.cnblogs.com/zjfjava/p/9219237.html 项目中新建目录之后,要在该目录下新增java Class文件,右键——>New发现无对应选 ...
- pytorch中文文档-torch.nn.init常用函数-待添加
参考:https://pytorch.org/docs/stable/nn.html torch.nn.init.constant_(tensor, val) 使用参数val的值填满输入tensor ...
- JProfiler的详细使用介绍
转:https://blog.csdn.net/huangjin0507/article/details/52452946 下载软件 官网地址:http://www.ej-technologies.c ...