题意:求$\sum\limits_{i=1}^n\sum\limits_{j=1}^i\sum\limits_{k=1}^i(i,j,k)$

先令$f(n)=\sum\limits_{i=1}^n\sum\limits_{j=1}^n(n,i,j)$

$\begin{align*}f(n)&=\sum\limits_{i=1}^n\sum\limits_{j=1}^n\sum\limits_{d=1}^n\left[(n,i,j)=d\right]d\\&=\sum\limits_{d|n}\sum\limits_{i=1}^{\frac nd}\sum\limits_{j=1}^{\frac nd}\left[\left(\dfrac nd,i,j\right)=1\right]d\\&=\sum\limits_{d|n}\sum\limits_{i=1}^{\frac nd}\sum\limits_{j=1}^{\frac nd}\sum\limits_{\substack{e|\frac nd\\e|i\\e|j}}d\mu(e)\\&=\sum\limits_{d|n}\sum\limits_{de|n}d\mu(e)\left(\dfrac n{de}\right)^2\end{align*}$

令$T=de$,枚举$T$并将原来的$e$代换

$\begin{align*}f(n)&=\sum\limits_{d|n}\sum\limits_{T|n}d\mu\left(\dfrac Td\right)\left(\dfrac nT\right)^2\\&=\sum\limits_{T|n}\sum\limits_{d|n}d\mu\left(\dfrac Td\right)\left(\dfrac nT\right)^2\end{align*}$

因为式中有$\mu\left(\dfrac Td\right)$所以必须满足$d|T$,也就是改写第二个sigma

$\begin{align*}f(n)&=\sum\limits_{T|n}\sum\limits_{d|T}d\mu\left(\dfrac Td\right)\left(\dfrac nT\right)^2\\&=\sum\limits_{T|n}\varphi(T)\left(\dfrac nT\right)^2\\&=\sum\limits_{T|n}\varphi\left(\dfrac nT\right)T^2\end{align*}$

$\begin{align*}\sum\limits_{i=1}^nf(i)&=\sum\limits_{i=1}^n\sum\limits_{T|i}\varphi\left(\dfrac iT\right)T^2\\&=\sum\limits_{T=1}^nT^2\sum\limits_{j=1}^{\left\lfloor\frac nT\right\rfloor}\varphi(j)\end{align*}$

除法下取整$O\left(\sqrt n\right)$枚举除数,欧拉函数求和直接上杜教筛即可

#include<stdio.h>
#include<map>
using namespace std;
typedef long long ll;
const int T=10000000;
int mod,inv6,inv2;
int mul(int a,int b){return a*(ll)b%mod;}
int ad(int a,int b){return(a+b)%mod;}
int de(int a,int b){return(a-b)%mod;}
int pr[10000010],phi[10000010];
bool np[10000010];
void sieve(){
	int i,j,m;
	np[1]=1;
	phi[1]=1;
	m=0;
	for(i=2;i<=T;i++){
		if(!np[i]){
			m++;
			pr[m]=i;
			phi[i]=i-1;
		}
		for(j=1;j<=m;j++){
			if(pr[j]*(ll)i>T)break;
			np[i*pr[j]]=1;
			if(i%pr[j]==0){
				phi[i*pr[j]]=phi[i]*pr[j];
				break;
			}
			phi[i*pr[j]]=phi[i]*(pr[j]-1);
		}
	}
	for(i=2;i<=T;i++)phi[i]=ad(phi[i],phi[i-1]);
}
int pow(int a,int b){
	int s=1;
	while(b){
		if(b&1)s=mul(s,a);
		a=mul(a,a);
		b>>=1;
	}
	return s;
}
int s(int n){return mul(mul(n,n+1),mul(n<<1|1,inv6));}
map<int,int>res;
map<int,int>::iterator it;
int dj(int n){
	if(n<=T)return phi[n];
	it=res.find(n);
	if(it!=res.end())return it->second;
	int s,i,nex;
	s=mul(mul(n,n+1),inv2);
	for(i=2;i<=n;i=nex+1){
		nex=n/(n/i);
		s=de(s,mul(nex-i+1,dj(n/i)));
	}
	return res[n]=s;
}
int main(){
	int n,i,nex,res;
	scanf("%d%d",&n,&mod);
	sieve();
	inv6=pow(6,mod-2);
	inv2=pow(2,mod-2);
	res=0;
	for(i=1;i<=n;i=nex+1){
		nex=n/(n/i);
		res=ad(res,mul(s(nex)-s(i-1),dj(n/i)));
	}
	printf("%d",(res+mod)%mod);
}

[Contest20180318]求和的更多相关文章

  1. Java程序:从命令行接收多个数字,求和并输出结果

    一.设计思想:由于命令行接收的是字符串类型,因此应先将字符串类型转化为整型或其他字符型,然后利用for循环求和并输出结果 二.程序流程图: 三.源程序代码:   //王荣荣 2016/9/23     ...

  2. Java之递归求和的两张方法

    方法一: package com.smbea.demo; public class Student { private int sum = 0; /** * 递归求和 * @param num */ ...

  3. EXCEL中对1个单元格中多个数字求和

    如A1=3779.3759.3769.3781.3750,A2对A1中4个数字求和怎么求!请高手赐教! 方法一:在B1中输入公式=SUM(MID(A1,{1,6,11,16,21},4)*1) 方法二 ...

  4. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  5. 从sum()求和引发的思考

    sum()求和是一个非常简单的函数,以前我的写法是这样,我想大部分和我一样刚开始学习JS的同学写出来的也会是这样. function sum() { var total=null; for(var i ...

  6. //给定N个整数序列{A1,A2,A3...An},求函数f(i,j)=(k=i~j)Ak的求和

    //给定N个整数序列{A1,A2,A3...An},求函数f(i,j)=(k=i~j)Ak的求和 # include<stdio.h> void main() { ,sum1; ]={,- ...

  7. Ajax中get请求和post请求

    我们在使用Ajax向服务器发送数据时,可以采用Get方式请求服务器,也可以使用Post方式请求服务器,那么什么时候该采用Get方式,什么时候该采用Post方式呢? Get请求和Post请求的区别: 1 ...

  8. POJ 2823 Sliding Window 线段树区间求和问题

    题目链接 线段树区间求和问题,维护一个最大值一个最小值即可,线段树要用C++交才能过. 注意这道题不是求三个数的最大值最小值,是求k个的. 本题数据量较大,不能用N建树,用n建树. 还有一种做法是单调 ...

  9. HDU 1166 敌兵布阵 线段树单点更新求和

    题目链接 中文题,线段树入门题,单点更新求和,建一棵树就可以了. #include <iostream> #include <cstdio> #include <cmat ...

随机推荐

  1. taotao购物车

    功能分析: 1.在用户不登陆的情况下也可以使用购物车,那么就需要把购物车信息放入cookie中. 2.可以把商品信息,存放到pojo中,然后序列化成json存入cookie中. 3.取商品信息可以从c ...

  2. sublime2创建一个html5的snippets文件

    背景:跟了一个网上课程,老师哗啦啦敲代码,屏幕上只敲了几个字,键盘一操作,瞬间一大溜代码,看得我心惊肉跳连忙暂停抄抄抄. 举个简单的例子,我需要创建一个html文件.但是我不想每次都敲固定的格式.那么 ...

  3. Kubernetes : 多节点 k8s 集群实践

    说明: 本文参考 『 Kubernetes 权威指南 』 第一章的案例. 需要说明的是, 这本书里有很多描述的东西和实践的案例不吻合. Kubernets 集群架构 架构图 Server List 节 ...

  4. 【洛谷 P1437】 [HNOI2004]敲砖块 (DP)

    题目链接 毒瘤DP题 因为\((i,j)\)能不能敲取决于\((i-1,j)\)和\((i-1,j+1)\),所以一行一行地转移显然是有后效性的. 于是考虑从列入手.我们把这个三角形"左对齐 ...

  5. 解决cursor未关闭造成的死锁

    参考:https://blog.csdn.net/zc474235918/article/details/72731363/ https://blog.csdn.net/zmx729618/artic ...

  6. python3,循环,方法练习2

    1:编写for循环,利用索引遍历出每一个字符 msg = 'hello egon 666' msg = 'hello egon 666' i = 0 for i in range(0, len(msg ...

  7. HDU1142 (Dijkstra+记忆化搜索)

    A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  8. (十二)Linux内核驱动之poll和select

    使用非阻塞 I/O 的应用程序常常使用 poll, select, 每个允许一个进程来决定它是否可读或者写一个或多个文件而不阻塞. 这些调用也可阻塞进程直到任何一个给定集合的文件描述符可用来读或写.  ...

  9. Selenium IDE安装和检查获取的控件路径技巧

    来源:http://www.jianshu.com/p/0ea2dc83549f 从学习Selenium 开始,都是自己写脚本,后来得知有个插件Selenium IDE可以录制脚本,也懒得用了,觉得自 ...

  10. 微信网页版的onclick事件不起作用

    我的错误是在跳转的url中拼接了url,如下: var myBaseUrl="https://xxx/"; function do() { $.ajax({ url :myBase ...