题意:求$\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. Codeforces 937.B Vile Grasshoppers

    B. Vile Grasshoppers time limit per test 1 second memory limit per test 256 megabytes input standard ...

  2. linux之scp命令

    linux之cp/scp命令+scp命令详解   名称:cp 使用权限:所有使用者 使用方式: cp [options] source dest cp [options] source... dire ...

  3. 解决“并非来自 Chrome 网上应用店。”

    Chrome谷歌浏览器已停用不支持的扩展程序解决方法 第一种方法:(亲测有效) 1.首先把需要安装的第三方插件,后缀.crx 改成 .rar,然后解压,得到一个文件夹 2.再打开chrome://ex ...

  4. Elasticsearch 5.2.1Cluster 搭建

    1.安装java cd ~ wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fw ...

  5. 理解SetCapture、ReleaseCapture、GetCapture(控制了消息发往哪个窗口,是理解消息的关键)

    理解SetCapture.ReleaseCapture.GetCapture 正常情况下,鼠标指针位于哪个窗口区域内,鼠标消息就自动发给哪个窗口.如果调用了SetCapture,之后无论鼠标的位置在哪 ...

  6. threadlocal作用

    理解:通过thread创建局部变量,每个线程可以获得该变量的副本,再每个线程中操作该副本相互之间不产生影响. 解决:数据库连接 常规一个线程连接一个数据库是没有问题的,但是在高并发的情况下,可能线程一 ...

  7. 【BZOJ3450】Easy [期望DP]

    Easy Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 某一天WJMZBMR在打osu~~ ...

  8. NYOJ 20 吝啬的国度 (深搜)

    题目链接 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号 ...

  9. Django-内置Admin

    Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: 依赖APP: django.contrib.auth django.contrib.contenttyp ...

  10. java servlet输出数据

    httpServletResponse.setContentType("text/html;charset=UTF-8"); httpServletResponse.getWrit ...