T1:

bzoj2705

题目描述:

给定一个n求\(\sum\limits_{i=1}^ngcd(i,n)\)

因为n太大,所以O(n)的做法肯定不行,然后就去想根号的方法。

\[\sum\limits_{i=1}^{n}gcd(i,n)
\]

\[=\sum\limits_{k|n}k*\sum\limits_{i=1}^n[gcd(i,n)==k]
\]

\[=\sum\limits_{k|n}k*\sum\limits_{i=1}^n[gcd(\frac{i}{k},\frac{n}{k})==1]
\]

\[=\sum\limits_{k|n}k*\sum_{i=1}^{\frac{n}{k}}[gcd(i,\frac{n}{k})==1]
\]

\[=\sum_{k|n}{k*φ(\frac{n}{k})}
\]

然后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

正解:

\[\sum\limits_{i=1}^n\sum\limits_{j=1}^igcd(i,j)
\]

枚举因数k

\[\sum\limits_{k=1}^nk*\sum\limits_{i=1}^n\sum\limits_{j=1}^i[gcd(i,j)==k]
\]

考虑所有最大公因数为k的情况,设\(i=ak,j=bk(a>=b)\)若要i与j做大公约数为k,则必须满足gcd(a,b)=1,满足此条件的所有情况数为φ(b),然后考虑b的取值范围,因为必须满足b*k<=n,所以\(b<=[\frac{n}{k}]\)。所以答案为

\[\sum\limits_{k=1}^nk*\sum\limits_{i=1}^{\frac{n}{k}}φ(i)
\]

所以线性求出欧拉函数,并求出前缀和即可。

代码:

#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:

uva11417

别问我为什么是luogu

题目描述:

给定一个整数n(1<=n<=100000),求\(\sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^ngcd(i,j)\)

解法:

\[\sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^ngcd(i,j)
\]

枚举因数k

\[\sum\limits_{k=1}^nk*\sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^n[gcd(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}]\)。所以答案为

\[\sum\limits_{k=1}^nk*\sum\limits_{i=1}^{\frac{n}{k}}φ(i)
\]

所以线性求出欧拉函数,并求出前缀和即可。

为什么和上面一样

但是因为i和j都不能为0并且j>i即b>a,所以b不能为1,所以要在最后减去φ(1)的情况,也就相当于把里面的i从2开始枚举。

所以最终答案为

\[\sum\limits_{k=1}^nk*\sum\limits_{i=1}^{\frac{n}{k}}φ(i)-1
\]

代码:

#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:

luogu2398

题目描述:

给定一个n(1<=n<=100000),求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^ngcd(i,j)\)

解法:

发现这个题数上面两个题的综合,所以,嘿嘿,将上面的两个题答案加起来即可,所以最终答案为

\[\sum\limits_{k=1}^n2*k*\sum\limits_{i=1}^{\frac{n}{k}}φ(i)-1
\]

代码:

#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的四道题的更多相关文章

  1. DDCTF2019 的四道题wp

    MIsc:流量分析 这道题,在比赛的时候就差个key了,但是没想到要改高度,后来群里师傅说了下,就再试试, 导出来改高度. 导出来,把 把%5c(4)前面的hex删掉,改成png,就直接拿去那个img ...

  2. lintcode中等题目的四道题

    第一题: 第一句先创建了一个解决问题的类, 第二句声明了一个公共接口的整形链表里面有N个整形数, 第三句给链表动态初始化, 第四步判断链表里的数有没有,如果N<=0则返回结果0,否则执行Prin ...

  3. 深入GCD(四):使用串行队列实现简单的预加载

    其主要思路是使用gcd创建串行队列,然后在此队列中先后执行两个任务:1.预加载一个viewController 2.将这个viewController推入代码如下:@implementation DW ...

  4. lintcode 四道题

    我们考虑对每个字符进行两边扩展,寻找回文串,并记录长度.有两种情况,一种是bab,从a向两边扩展,一种abba,从bb中间向两边扩展. dp[i][j] 表示子串s[i-j]是否是回文 初始化:dp[ ...

  5. google Kickstart Round F 2017 四道题题解

    Problem A. Kicksort 题意抽象一下为: 对于一个每次都从数列正中间取划分数的快速排序,给定一个1-n的排列,问快排的复杂度对于这个排列是否会退化为最坏复杂度. 数据范围: 测试组数1 ...

  6. GCD 学习(四) dispatch_group

    如果想在dispatch_queue中所有的任务执行完成后在做某种操作,在串行队列中,可以把该操作放到最后一个任务执行完成后继续,但是在并行队列中怎么做呢.这就有dispatch_group 成组操作 ...

  7. GCD 扫盲篇

    GCD有四个概念:串行队列.并行队列.同步.异步四者. 如下简介: 这里不仅给出了不确定性,而且也给出了确定性.对于初学者而言,有时候因为那些不确定的东西所造成的疑问会像没有闸却在疾驰的汽车一样让人惊 ...

  8. NOIP2012普及组 (四年后的)解题报告 -SilverN

    本章施工仍未完成 现在的时间是3.17 0:28,我困得要死 本来今天(昨天?)晚上的计划是把整个四道题的题解写出来,但是到现在还没写完T4的高效算法,简直悲伤. 尝试了用floyd写T4,终于大功告 ...

  9. ACM第四次积分赛

    虽然因为第一题给的数据有问题,没能四道题都做出来,但是这次第四名,进步很大,继续努力! SAU-ACM总比赛成绩       姓名     账号  上学期成绩 第一次成绩 第二次成绩 第三次成绩 第四 ...

随机推荐

  1. springMVC实现增删改查

    首先需要准备好一张数据库表我这里用emp这张表:具体代码: /* SQLyog 企业版 - MySQL GUI v8.14 MySQL - 5.1.73-community ************* ...

  2. IE中iframe标签显示在DIV之上的问题解决方案

    在做网页时前端时,使用IE打开时会出现标题栏DIV被遮挡PDF遮挡, 后在stackoverflow中查到是IE浏览器的问题:链接https://stackoverflow.com/questions ...

  3. flex 输入框布局

    1:创建一个弹性容器(display:flex) 2:构建2个或3个弹性项目. 3:把弹性项目设置为居中对齐.(align-items:center) 4:改变input自身对齐方式,把它设置为拉伸以 ...

  4. 神经网络MPLClassifier分类

    代码: # -*- coding: utf-8 -*- """ Created on Fri Aug 24 14:38:56 2018 @author: zhen &qu ...

  5. 将对象xml序列化和反序列化

    //将一个对象按XML序列化的方式写入到一个文件,使用的默认的UTF8编码格式 //o为要序列化的对象 //path保存文件的路径 public static object  _lockObj=new ...

  6. firewalld防火墙设置

    CentOS7/RHEL7系统默认的iptables管理工具是firewalld,不再是以往的iptables-services,命令用起来也是不一样了,当然你也可以选择卸载firewalld,安装i ...

  7. ubuntu18.04从零开始配置环境(jdk+tomcat+idea)到使用idea开发web应用和servlet

    昨天吃了亏,搞了一下午才把环境配置好,故此将整个过程记录一下以防日后需要. 注意:因为我的博客模块的原因,所以我把图片压缩了一些,如果有看不清的, 可以  右键图片->在新标签页打开图片 目录: ...

  8. Oracle知识点总结2

    1.聚合函数:也叫分组函数. 常用聚合函数:返回的都是NUMBER类型的值. 注:避免使用 COUNT(*) ,而使用 COUNT(ROWID) 2.分组统计:group by  字段名 having ...

  9. Cookie Session和自定义分页

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  10. MessageDigest类

    public abstract class MessageDigest extends MessageDigestSpi API中的中英文对照简介(未完) java.security.MessageD ...