1349. 最大公约数 (Standard IO)

Time Limits: 1000 ms Memory Limits: 65536 KB

Description

  小菜的妹妹小诗就要读小学了!正所谓计算机要从娃娃抓起,小菜决定在幼儿园最后一段轻松的时间里教妹妹编程。

  小菜刚教完gcd即最大公约数以后,一知半解的妹妹写了如下一段代码:

   sum:=0;

   for i:=1 to n-1 do

   for j:=i+1 to n do sum:=sum+gcd(i,j)

  显然这个程序的效率是很低的,小明打算写一个更强的程序,在求出sum的同时比妹妹跑的更快。

Input

  第一行一个整数t,即表示有t组数据

  接下来t行,每行一个整数n

Output

  t行,每行一个整数,表示n所对应的sum值

Sample Input

2

10

100

Sample Output

67

13015

Data Constraint

Hint

【数据规模】

  20%数据t≤100,n≤100

  40%数据t≤1000,n≤2000

  100%数据t≤10000,n≤1000000

题解

看到了gcd,那就很明显是数论题

对这道题我们要求的是

∑i=1n−1∑j=i+1ngcd(i,j)

固定j,那么

∑i=1ngcd(i,n)
=∑i=1n∑d|n[gcd(i,n)==d]∗d
=∑i=1n∑d|n[gcd(id,nd)==1]∗d
=∑d|nφ(nd)∗d

因此,答案就是

∑i=2n∑j=1⌊n/i⌋φ(i)∗j

用前缀和优化一下

记ans[i∗j]=φ(i)∗j,答案就是

∑i=2nans[i]

代码

#include<cstdio>
#define M 80000
#define N 1000010
#define max(a,b) (((a)>(b))?(a):(b)) long a[N],p[M],phi[N],t;
long long ans[N];
bool b[N]; int main()
{ long tot,n,i,j,k,maxx=0;
scanf("%ld",&tot);
for(i=1;i<=tot;i++){
scanf("%ld",&a[i]);
maxx=max(maxx,a[i]);
}
n=maxx;
phi[1]=1;
for(i=2;i<=n;i++){
if(!b[i]){
phi[i]=i-1;
p[++t]=i;
}
for(j=1;j<=t&&i*p[j]<=n;j++){
b[i*p[j]]=true;
if(i%p[j]==0){
phi[i*p[j]]=phi[i]*p[j];
break;
}else phi[i*p[j]]=phi[i]*(p[j]-1);
}
}
for(i=2;i<=n;i++)
for(j=1;j<=n/i;j++)
ans[i*j]+=phi[i]*j;
for(i=2;i<=n;i++)
ans[i]+=ans[i-1];
for(k=1;k<=tot;k++)
printf("%lld\n",ans[a[k]]);
return 0;
}

JZOJ 1349. 最大公约数 (Standard IO)的更多相关文章

  1. JZOJ 1736. 扑克游戏 (Standard IO)

    1736. 扑克游戏 (Standard IO) Time Limits: 1000 ms Memory Limits: 128000 KB Description 有一棵无穷大的满二叉树,根为sta ...

  2. JZOJ 1776. 经济编码 (Standard IO)

    1776. 经济编码 (Standard IO) Time Limits: 1000 ms Memory Limits: 128000 KB Description 为降低资料储存的空间或增加资料传送 ...

  3. JZOJ 1774. 合并果子 (Standard IO)

    1774. 合并果子 (Standard IO) Time Limits: 1000 ms Memory Limits: 65536 KB Description 在一个果园里,多多已经将所有的果子打 ...

  4. JZOJ 2137. 【GDKOI2004】城市统计 (Standard IO)

    2137. [GDKOI2004]城市统计 (Standard IO) Time Limits: 1000 ms  Memory Limits: 128000 KB  Detailed Limits  ...

  5. JZOJ 5326. LCA 的统计 (Standard IO)

    5326. LCA 的统计 (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Description Input Output S ...

  6. JZOJ 5307. 【NOIP2017提高A组模拟8.18】偷窃 (Standard IO)

    5307. [NOIP2017提高A组模拟8.18]偷窃 (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Description ...

  7. JZOJ 5286. 【NOIP2017提高A组模拟8.16】花花的森林 (Standard IO)

    5286. [NOIP2017提高A组模拟8.16]花花的森林 (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Descript ...

  8. JZOJ 5305. 【NOIP2017提高A组模拟8.18】C (Standard IO)

    5305. [NOIP2017提高A组模拟8.18]C (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Description ...

  9. JZOJ 5257. 小X的佛光 (Standard IO)

    5257. 小X的佛光 (Standard IO) Time Limits: 2000 ms Memory Limits: 524288 KB Description Input Output Sam ...

随机推荐

  1. 阿里巴巴IconFont的使用方式

    一.解释一下为什么要使用IconFont? IconFont顾名思义就是把图标用字体的方式呈现. 其优点在于以下几个方面: 1.可以通过css的样式改变其颜色:(最霸气的理由) 2.相对于图片来说,具 ...

  2. OfficeCommandbarViewer20171005.rar

    OfficeCommandbarViewer用于查看Office各组件工具栏和控件信息的一款软件. 采用了本地XML文件的方式,所以使用本工具不需要提前打开任何Office组件. 动态图: 下载地址: ...

  3. python+locust性能测试-最简单的登录点击次数

    from locust import HttpLocust,TaskSet,task import os class UserBehavior(TaskSet): @task def login(se ...

  4. Python爬虫带用户名密码登录

    # -*- coding: utf-8 -*- """ Created on Wed Jun 6 13:18:58 2018 @author: Lenovo " ...

  5. Google DevTools Explanation

    Evaluating network performance The Network panel records information about each network operation in ...

  6. JVM 的内存布局

    这是jdk7以后的版本 1. Heap(堆区) Heap OOM 障最主要的发源地, 它存储着几乎所有的实例对象, 堆由垃圾收集器自动回收, 堆区由各子线程共享使用.通常情况下 它占用的空间是所有内存 ...

  7. deeplearning.ai 人工智能行业大师访谈

    Geoffrey Hinton 1. 怀揣着对大脑如何存储记忆的好奇,Hinton本科最开始学习生物学和物理学,然后放弃,转而学习哲学:然后觉得哲学也不靠谱,转而学习心理学:然后觉得心理学在解释大脑运 ...

  8. python多线程交替打印abc以及线程池进程池的相关概念

    import threading import sys import time def showa(): while True: lockc.acquire() #获取对方的锁,释放自己的锁 prin ...

  9. Hibernate之cascade属性和inverse属性

    1.cascade属性 cascade属性的作用是描述关联对象进行操作时的级联特性,只有涉及关系的元素才有cascade属性.具有cascade属性的标记包括<many-to-one/>. ...

  10. 吴裕雄--python学习笔记:os模块函数

    os.sep:取代操作系统特定的路径分隔符 os.name:指示你正在使用的工作平台.比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'. os.getcwd:得 ...