51nod-1363: 最小公倍数之和
【传送门:51nod-1363】
简要题意:
给出一个数n,求出1到n的数与n的最小公倍数的和
多组数据
题解:
理所当然推柿子
原题相当于求$\sum_{i=1}^{n}\frac{i*n}{gcd(i,n)}$
先枚举d=gcd(i,n),然后化简得到$$n*\sum_{d|n}\sum_{i=1}^{\frac{n}{d}}i[gcd(i,\frac{n}{d})==1]$$
相当于求1到n-1中,与n互质的数和,设y<x,如果gcd(y,x)==1,那么gcd(x-y,x)==1,两式的贡献就是x了
所以1到n-1中,与n互质的数和为$\frac{\phi(n)*n}{2}$,特殊的,如果n=1,则数和为1
那么原式就等于$$n*\sum_{d|n且d不为n}\frac{\frac{n}{d}*\phi(\frac{n}{d})}{2}+1$$
再化简得到$$n+\frac{n}{2}\sum_{d|n且d>1}d*phi(d)$$
这样,这个式子就变成$O(\sqrt{n})$,但是多组数据仍会超时
实际上我们将n质因数分解得到$n=\prod_{i=1}^{x}p[i]^a[i]$
因为p[i]两两互质,所以可以转化为$$n+\prod_{i=1}^{x}\sum_{j=0}^{a[i]}\phi(p[i]^j)*p[i]^j$$
根据欧拉函数的性质可以得到$$n+\prod_{i=1}^{x}1+\sum_{j=1}^{a[i]}(p[i]-1)*p[i]^{2j-1}$$
再根据等比数列求和公式得到$$n+\prod_{i=1}^{x}1+(p[i]-1)*\frac{p[i]^{2*a[i]+1}-p[i]}{p[i]^2-1}$$
$$n+\prod_{i=1}^{x}1+\frac{p[i]^{2*a[i]+1}-p[i]}{p[i]+1}$$
然后线筛素数加速质因数分解就可以过了,记得最后处理1的情况
参考代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long LL;
LL Mod=1e9+;
int prime[],m,v[];
void pre(int n)
{
m=;
for(int i=;i<=n;i++)
{
if(v[i]==)
{
v[i]=i;
prime[++m]=i;
}
for(int j=;j<=m;j++)
{
if(prime[j]>n/i||prime[j]>v[i]) break;
v[i*prime[j]]=prime[j];
}
}
}
LL p_mod(LL a,LL b)
{
LL ans=;
while(b!=)
{
if(b%==) ans=ans*a%Mod;
a=a*a%Mod;b/=;
}
return ans;
}
int main()
{
//freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);
pre();
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
LL ans=,d=n;
for(int i=;i<=m&&prime[i]<=n/prime[i];i++)
{
LL p=prime[i];
if(n%p==)
{
LL s=;
while(n%p==) s++,n/=p;
ans=ans*(+p*((p_mod(p,2LL*s)-+Mod)%Mod)%Mod*p_mod(p+,Mod-)%Mod)%Mod;
}
}
ans=ans*(+(LL)(n-)*n%Mod)%Mod;
ans=(ans-+Mod)%Mod;
printf("%lld\n",(ans*d%Mod*p_mod(2LL,Mod-)%Mod+d)%Mod);
}
return ;
}
51nod-1363: 最小公倍数之和的更多相关文章
- 51nod 1363 最小公倍数之和 ——欧拉函数
给出一个n,求1-n这n个数,同n的最小公倍数的和.例如:n = 6,1,2,3,4,5,6 同6的最小公倍数分别为6,6,6,12,30,6,加在一起 = 66. 由于结果很大,输出Mod 1000 ...
- 51nod - 1363 - 最小公倍数之和 - 数论
https://www.51nod.com/Challenge/Problem.html#!#problemId=1363 求\(\sum\limits_{i=1}^{n}lcm(i,n)\) 先换成 ...
- 51nod 1238 最小公倍数之和 V3
51nod 1238 最小公倍数之和 V3 求 \[ \sum_{i=1}^N\sum_{j=1}^N lcm(i,j) \] \(N\leq 10^{10}\) 先按照套路推一波反演的式子: \[ ...
- 51nod 1363 最小公倍数的和 欧拉函数+二进制枚举
1363 最小公倍数之和 题目来源: SPOJ 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 给出一个n,求1-n这n个数,同n的最小公倍数的和.例如:n = 6,1,2,3 ...
- 51NOD 1238 最小公倍数之和 V3 [杜教筛]
1238 最小公倍数之和 V3 三种做法!!! 见学习笔记,这里只贴代码 #include <iostream> #include <cstdio> #include < ...
- 51nod 1190 最小公倍数之和 V2
给出2个数a, b,求LCM(a,b) + LCM(a+1,b) + .. + LCM(b,b). 例如:a = 1, b = 6,1,2,3,4,5,6 同6的最小公倍数分别为6,6,6,12,30 ...
- 51nod 1238 最小公倍数之和 V3 【欧拉函数+杜教筛】
首先题目中给出的代码打错了,少了个等于号,应该是 G=0; for(i=1;i<=N;i++) for(j=1;j<=N;j++) { G = (G + lcm(i,j)) % 10000 ...
- 51nod 1190 最小公倍数之和 V2【莫比乌斯反演】
参考:http://blog.csdn.net/u014610830/article/details/49493279 这道题做起来感觉非常奇怪啊--头一次见把mu推出来再推没了的-- \[ \sum ...
- [51Nod 1238] 最小公倍数之和 (恶心杜教筛)
题目描述 求∑i=1N∑j=1Nlcm(i,j)\sum_{i=1}^N\sum_{j=1}^Nlcm(i,j)i=1∑Nj=1∑Nlcm(i,j) 2<=N<=10102<=N ...
- 【学术篇】51nod 1238 最小公倍数之和
这是一道杜教筛的入(du)门(liu)题目... 题目大意 求 \[ \sum_{i=1}^n\sum_{j=1}^nlcm(i,j) \] 一看就是辣鸡反演一类的题目, 那就化式子呗.. \[ \s ...
随机推荐
- ORA-03137 - ORA-12592 TNS:BAD PACKET OR ORA-3137 故障处理
环境 操作系统:CentOS release 6.8 数据库:oracle 11.2.0.4.190115 说明:数据库psu 为19年1月份的补丁,可不间断运行,但是开发提示在执行一些批处理的时候, ...
- window 10 多版本激活工具
window 10 通用版激活工具 云盘地址:https://pan.baidu.com/s/1bo3L4Kn 激活工具网站:http://www.tudoupe.com/win10/win10jih ...
- VM虚拟机NAT模式主机与虚拟机ping不通解决方案
VM虚拟机与真机通信三种模式, 桥接模式,NAT 模式 ,HOST-ONLY 模式. NAT模式 使用虚拟机的一个虚拟网卡做NAT网关,在nat网关上配dhcp ,或者直接用静态地址.就相当于形成了一 ...
- 异常及String
异常时描述错误信息的对象,在编码过程中我们会遇到很多异常 例如: 1.java.lang.ArithmeticException 算数异常.算数运算出现错误时抛出 比如用0做除数 2.java.lan ...
- matplotlib学习笔记.CookBook
matplotlib 是Python下的一个高质量的画图库,可以简单的类似于MATLAB方法构建高质量的图表. 原始文章地址:http://zanyongli.i.sohu.com/blog/view ...
- 杭电 1012 u Calculate e【算阶乘】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1012 解题思路:对阶乘递归求和 反思:前面3个的输出格式需要注意,可以自己单独打印出来,也可以在for ...
- 搞不懂的算法-排序篇<2>
上一篇排序算法<1>中,排序算法的时间复杂度从N2到NlgN变化,但他们都有一个共同的特点,基于比较和交换数组中的元素来实现排序,我们称这些排序算法为比较排序算法.对于比较排序算法,所有的 ...
- gulp给文件后添加md5时间戳
这里为总的方法,实际项目中拷贝出来的,底下有详细的总结以及只针对添加时间戳的方法 1 // 引入 gulp及组件 var gulp = require('gulp'), autoprefixer = ...
- ack 工具
ack-tools ack其实就是快速查找工具,但centos在没有这个安装包. 下载安装 cd /tmp git clone https://github.com/dongci/ack.git cd ...
- K3 新单到老单关联字段的添加
新单到老单字段的添加分为两种: 一种为文本字段信息的关联,新单与老单字段的信息均为文本字段: 另一种为基础资料信息的关联,新单与老单均为基础资料字段信息. K3 WISE 11.0中存储老 ...