【传送门: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: 最小公倍数之和的更多相关文章

  1. 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 ...

  2. 51nod - 1363 - 最小公倍数之和 - 数论

    https://www.51nod.com/Challenge/Problem.html#!#problemId=1363 求\(\sum\limits_{i=1}^{n}lcm(i,n)\) 先换成 ...

  3. 51nod 1238 最小公倍数之和 V3

    51nod 1238 最小公倍数之和 V3 求 \[ \sum_{i=1}^N\sum_{j=1}^N lcm(i,j) \] \(N\leq 10^{10}\) 先按照套路推一波反演的式子: \[ ...

  4. 51nod 1363 最小公倍数的和 欧拉函数+二进制枚举

    1363 最小公倍数之和 题目来源: SPOJ 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 给出一个n,求1-n这n个数,同n的最小公倍数的和.例如:n = 6,1,2,3 ...

  5. 51NOD 1238 最小公倍数之和 V3 [杜教筛]

    1238 最小公倍数之和 V3 三种做法!!! 见学习笔记,这里只贴代码 #include <iostream> #include <cstdio> #include < ...

  6. 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 ...

  7. 51nod 1238 最小公倍数之和 V3 【欧拉函数+杜教筛】

    首先题目中给出的代码打错了,少了个等于号,应该是 G=0; for(i=1;i<=N;i++) for(j=1;j<=N;j++) { G = (G + lcm(i,j)) % 10000 ...

  8. 51nod 1190 最小公倍数之和 V2【莫比乌斯反演】

    参考:http://blog.csdn.net/u014610830/article/details/49493279 这道题做起来感觉非常奇怪啊--头一次见把mu推出来再推没了的-- \[ \sum ...

  9. [51Nod 1238] 最小公倍数之和 (恶心杜教筛)

    题目描述 求∑i=1N∑j=1Nlcm(i,j)\sum_{i=1}^N\sum_{j=1}^Nlcm(i,j)i=1∑N​j=1∑N​lcm(i,j) 2<=N<=10102<=N ...

  10. 【学术篇】51nod 1238 最小公倍数之和

    这是一道杜教筛的入(du)门(liu)题目... 题目大意 求 \[ \sum_{i=1}^n\sum_{j=1}^nlcm(i,j) \] 一看就是辣鸡反演一类的题目, 那就化式子呗.. \[ \s ...

随机推荐

  1. 如何将本地代码上传到Github

    这些内容只是Git知识的冰山一角 更多知识请 阅读 Pro git.Pro git 所有内容均根据知识共享署名非商业性共享3.0版许可证授权,各位可以免费下载阅读,有pdf.mobi.qpub格式可以 ...

  2. 导入Excel时去除多余的空白行

    https://blog.csdn.net/shuishousuiyue/article/details/44773987 按着上面链接用的第一种方式,如下图所示:第二种方式要遍历每一个Excel单元 ...

  3. 学习js与css 写个2048

    学习阶段,还是写点小东西练练手学的有意思一点,今天用栅格布局做了一个2048,但是移动动画和合并特效没有做,只简单的实现了一下功能. 记录一下学习的过程. 1.入口函数,初始化界面,我这里是直接是一个 ...

  4. javascript中构造函数的三种方式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. hdu 2444 The Accomodation of Students 判断是否构成二分图 + 最大匹配

    此题就是求最大匹配.不过需要判断是否构成二分图.判断的方法是人选一点标记为红色(0),与它相邻的点标记为黑色(1),产生矛盾就无法构成二分图.声明一个vis[],初始化为-1.通过深搜,相邻的点不满足 ...

  6. 【从零开始】【Java】【2】项目最开始都有什么鬼

    闲聊 刨其根知其底. 让我们从一开始就慢嚼细咽. 开始 先来看下项目都有什么: 项目结构图 pom文件图 项目结构 项目=核心代码+依赖管理文件+说明文件+IDE配套文件+外部依赖包: 核心代码:sr ...

  7. Apex语言(二)变量与常量

    1.变量 凡是交给计算运算(处理)的数据就是变量,用来保存参加运算的数据和计算结果. 变量由变量名来标识. 变量名由字母数字和下划线组成,不能以数字开头. [正确]number,number1,num ...

  8. openlayers5学习笔记-添加Overlay

    tmp.addPosition = function (map, item) { var ele = document.createElement("div"); var img ...

  9. Centos7 单节点安装 FastDFS + FastDHT服务

    Centos7 单节点安装 FastDFS + FastDHT服务 1.安装gcc(编译时需要) FastDFS是C语言开发,安装FastDFS需要先将官网下载的源码进行编译,编译依赖gcc环境,如果 ...

  10. 算法46----移除K位数字

    一.题目:移除K位数字 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. 注意: num 的长度小于 10002 且 ≥ k. num 不会包含任何前导零. 示 ...