[Contest20180318]求和
题意:求$\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]求和的更多相关文章
- Java程序:从命令行接收多个数字,求和并输出结果
一.设计思想:由于命令行接收的是字符串类型,因此应先将字符串类型转化为整型或其他字符型,然后利用for循环求和并输出结果 二.程序流程图: 三.源程序代码: //王荣荣 2016/9/23 ...
- Java之递归求和的两张方法
方法一: package com.smbea.demo; public class Student { private int sum = 0; /** * 递归求和 * @param num */ ...
- EXCEL中对1个单元格中多个数字求和
如A1=3779.3759.3769.3781.3750,A2对A1中4个数字求和怎么求!请高手赐教! 方法一:在B1中输入公式=SUM(MID(A1,{1,6,11,16,21},4)*1) 方法二 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- 从sum()求和引发的思考
sum()求和是一个非常简单的函数,以前我的写法是这样,我想大部分和我一样刚开始学习JS的同学写出来的也会是这样. function sum() { var total=null; for(var i ...
- //给定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; ]={,- ...
- Ajax中get请求和post请求
我们在使用Ajax向服务器发送数据时,可以采用Get方式请求服务器,也可以使用Post方式请求服务器,那么什么时候该采用Get方式,什么时候该采用Post方式呢? Get请求和Post请求的区别: 1 ...
- POJ 2823 Sliding Window 线段树区间求和问题
题目链接 线段树区间求和问题,维护一个最大值一个最小值即可,线段树要用C++交才能过. 注意这道题不是求三个数的最大值最小值,是求k个的. 本题数据量较大,不能用N建树,用n建树. 还有一种做法是单调 ...
- HDU 1166 敌兵布阵 线段树单点更新求和
题目链接 中文题,线段树入门题,单点更新求和,建一棵树就可以了. #include <iostream> #include <cstdio> #include <cmat ...
随机推荐
- MongoDB加索引
1.登陆MongoDB, 命令行在MongoDB主目录下执行:mongo -port 27017 2.切换至需要添加索引的db 并授权 use MeetingBooking db.auth({&quo ...
- fieldset——一个不常用的HTML标签
fieldset 标签 -- 对表单进行分组 在form表单中,我们可以对form中的信息进行分组归类,如注册表单的form,我们可以将注册信息分组成 基本信息(一般为必填) 详细信息(一般为可选) ...
- VC++中编译C出错:error C2143: syntax error : missing ';' before 'type'
转摘自:http://preceo.blog.51cto.com/6225017/1130931 近来写程序时发现了一个问题,用 VC 编译 C语言是 总是提示一个错误:error C2143: sy ...
- 如何解决DuplicateFileException: Duplicate files copied in APK问题
问题:有重复的文件存在APK里 解决方案:在Module里的build.gradle中设置忽略此重复文件即可.
- js 读写文件
读写文件: var f = fso.CreateTextFile("c:\\pexam\\"+name+".txt", true); f.write(arr); ...
- 全排列---(dfs)
全排列输入一个数n,按字典序输出1-n的全排列 #include "cstdio" #include "cstring" ],ans[],n; void dfs ...
- 动态规划:LCIS
先给出状态转移方程: 定义状态 F[i][j]表示以a串的前i个整数与b串的前j个整数且以b[j]为结尾构成的LCIS的长度 状态转移方程: ①F[i][j] = F[i-][j] (a[i] != ...
- Nginx的主要配置参数说明
#定义Nginx运行的用户和用户组user www www; #nginx进程数,建议设置为等于CPU总核心数.worker_processes 8; #全局错误日志定义类型,[ debug | in ...
- locust===Writing a locustfile
The Locust class A locust class represents one user (or a swarming locust if you will). Locust will ...
- 【 学习笔记 】memcached基础知识
源地址:http://kb.cnblogs.com/page/42731/ 仔细学习了下,以下是记录的笔记备忘内容. 一.memcached是什么? memcached是高性能的分布式内存缓存服 ...