$\newcommand{fl}[1]{\left\lfloor#1\right\rfloor}$题意:求$\sum\limits_{i=1}^a\sum\limits_{j=1}^b\sum\limits_{k=1}^c\sigma_0(ijk)$

做这题要用到一个结论:$\sum\limits_{i=1}^a\sum\limits_{j=1}^b\sum\limits_{k=1}^c\sigma_0(ijk)=\sum\limits_{\substack{(i,j)=(j,k)=(k,i)=1\\i\leq a,j\leq b,k\leq c}}\fl{\frac ai}\fl{\frac bj}\fl{\frac ck}$,证明如下

令$f(a,b,c)=\sum\limits_{i=1}^a\sum\limits_{j=1}^b\sum\limits_{k=1}^c\sigma_0(ijk),g(a,b,c)=\sum\limits_{\substack{(i,j)=(j,k)=(k,i)=1\\i\leq a,j\leq b,k\leq c}}\fl{\frac ai}\fl{\frac bj}\fl{\frac ck}$

对$f$容斥

$f(a,b,c)-f(a-1,b,c)-f(a,b-1,c)-f(a,b,c-1)+f(a-1,b-1,c)+f(a-1,b,c-1)+f(a,b-1,c-1)-f(a-1,b-1,c-1)=\sigma_0(abc)$

对$g$写出形式相同的式子

$g(a,b,c)-g(a-1,b,c)-g(a,b-1,c)-g(a,b,c-1)+g(a-1,b-1,c)+g(a-1,b,c-1)+g(a,b-1,c-1)-g(a-1,b-1,c-1)\\=\sum\limits_{\substack{(i,j)=(j,k)=(k,i)=1\\i\leq a,j\leq b,k\leq c}}\left(\fl{\frac ai}-\fl{\frac{a-1}i}\right)\left(\fl{\frac bj}-\fl{\frac{b-1}j}\right)\left(\fl{\frac ck}-\fl{\frac{c-1}k}\right)$

观察$g$的这条式子,只有$i|a,j|b,k|c$时,右边的三个括号才会有$1$的贡献,所以它统计的是满足$(i,j)=(j,k)=(k,i)=1$且$i|a,j|b,k|c$的$(i,j,k)$组数

对一个质数$p$,设$x$为满足$p^x|a$的最大$x$,类似地定义$y,z$

仅由$p$构成的$abc$的约数有$x+y+z+1$个($1$也被算入)

仅由$p$构成的$(i,j,k)$有$x+y+z+1$组($(1,1,1),(p^{1\cdots x},1,1),(1,p^{1\cdots y},1),(1,1,p^{1\cdots z})$)

又因为这俩都是积性函数,所以我们证明了$\sigma_0(abc)=\sum\limits_{\substack{(i,j)=(j,k)=(k,i)=1\\i|a,j|b,k|c}}$

这样一来,$f$和$g$的递推式就一模一样了,又因为$f(1,1,1)=g(1,1,1)=1$,所以$f(a,b,c)=g(a,b,c)$,得证

我们再回来推这题的公式

$\begin{align*}\sum\limits_{i=1}^a\sum\limits_{j=1}^b\sum\limits_{k=1}^c\sigma_0(ijk)&=\sum\limits_{\substack{(i,j)=(j,k)=(k,i)=1\\i\leq a,j\leq b,k\leq c}}\fl{\frac ai}\fl{\frac bj}\fl{\frac ck}\\&=\sum\limits_{i=1}^a\sum\limits_{j=1}^b[(i,j)=1]\fl{\frac ai}\fl{\frac bj}\sum\limits_{k=1}^c[(k,ij)=1]\fl{\frac ck}\\&=\sum\limits_{i=1}^a\sum\limits_{j=1}^b[(i,j)=1]\fl{\frac ai}\fl{\frac bj}\sum\limits_{d|ij}\mu(d)\sum\limits_{k=1}^{\fl{\frac cd}}\fl{\frac c{kd}}\end{align*}$

令$f(n)=\sum\limits_{d|n}\mu(d)\sum\limits_{k=1}^{\fl{\frac cd}}\fl{\frac c{kd}}$,我们需要预处理出$f(1\cdots ab)$的值

注意到当$d$确定的时候,第二个sigma的值也确定了,所以我们枚举$d$,计算第二个sigma的值,并更新$d$的倍数的$f(n)$

最后统计答案即可,总时间复杂度$O\left(ab\log_2(ab)\right)$

#include<stdio.h>
typedef long long ll;
const int mod=1<<30,T=4000000;
int max(int a,int b){return a>b?a:b;}
int mul(int a,int b){return a*(ll)b%mod;}
void inc(int&a,int b){(a+=b)%=mod;}
int pr[T+10],mu[T+10],M;
bool np[T+10];
void sieve(){
	int i,j,M;
	M=0;
	mu[1]=1;
	for(i=2;i<=T;i++){
		if(!np[i]){
			M++;
			pr[M]=i;
			mu[i]=-1;
		}
		for(j=1;j<=M&&pr[j]*(ll)i<=T;j++){
			np[i*pr[j]]=1;
			if(i%pr[j]==0)break;
			mu[i*pr[j]]=-mu[i];
		}
	}
}
int f[T+10],g[2010][2010];
int main(){
	sieve();
	int a,b,c,i,j,d,ans;
	scanf("%d%d%d",&a,&b,&c);
	for(d=1;d<=a*b;d++){
		if(mu[d]){
			j=0;
			for(i=1;i<=c/d;i++)inc(j,c/(i*d));
			j*=mu[d];
			for(i=d;i<=a*b;i+=d)inc(f[i],j);
		}
	}
	for(i=1;i<=max(a,b);i++){
		for(j=1;j<=i;j++){
			if(i%j==0)
				g[i][j]=j;
			else
				g[i][j]=g[j][i%j];
		}
	}
	for(i=1;i<=max(a,b);i++){
		for(j=i+1;j<=max(a,b);j++)g[i][j]=g[j][i];
	}
	ans=0;
	for(i=1;i<=a;i++){
		for(j=1;j<=b;j++){
			if(g[i][j]==1)inc(ans,mul(mul(a/i,b/j),f[i*j]));
		}
	}
	printf("%d",ans);
}

[CF235E]Number Challenge的更多相关文章

  1. Codeforces 235E. Number Challenge DP

    dp(a,b,c,p) = sigma ( dp(a/p^i,b/p^j,c/p^k) * ( 1+i+j+k) ) 表示用小于等于p的素数去分解的结果有多少个 E. Number Challenge ...

  2. Easy Number Challenge(暴力,求因子个数)

    Easy Number Challenge Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I ...

  3. 『NYIST』第八届河南省ACM竞赛训练赛[正式赛一]CF-236B. Easy Number Challenge

    B. Easy Number Challenge time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  4. Java实现 蓝桥杯 算法训练 Number Challenge(暴力)

    试题 算法训练 Number Challenge 资源限制 时间限制:3.0s 内存限制:512.0MB 问题描述 定义d(n)为n的约数个数.现在,你有三个数a,b,c.你的任务是计算下面式子mod ...

  5. 「CF235E」Number Challenge「莫比乌斯反演」

    一个结论:(从二维扩展来的,三维也是对的,证明可以考虑质因数分解) \[ d(ijk)=\sum_{i'|i}\sum_{j'|j}\sum_{k'|k}[\gcd(i',j')=1][\gcd(i' ...

  6. Codeforces 235E Number Challenge

    http://codeforces.com/contest/235/problem/E 远距离orz......rng_58 证明可以见这里(可能要FQ才能看到) 还是copy一下证明吧: 记 $$f ...

  7. CF#235E. Number Challenge

    传送门 可以理解为上一道题的扩展板.. 然后我们就可以YY出这样一个式子 ${\sum_{i=1}^a\sum_{j=1}^b\sum_{k=1}^cd(ijk)=\sum_{i=1}^a\sum_{ ...

  8. Codeforces 235 E Number Challenge

    Discription Let's denote d(n) as the number of divisors of a positive integer n. You are given three ...

  9. CodeForces 235E Number Challenge (莫比乌斯反演)

    题意:求,其中d(x) 表示 x 的约数个数. 析:其实是一个公式题,要知道一个结论 知道这个结论就好办了. 然后就可以解决这个问题了,优化就是记忆化gcd. 代码如下: #pragma commen ...

随机推荐

  1. size用法小记

    By francis_hao    Feb 14,2017 列出二进制文件各个段的大小和总大小 概述 选项解释 -A -B --format=compatibility 选择显示的格式, -A = - ...

  2. HDU3829:Cat VS Dog(最大独立集)

    Cat VS Dog Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others)Total ...

  3. [POJ2954&POJ1265]皮克定理的应用两例

    皮克定理: 在一个多边形中.用I表示多边形内部的点数,E来表示多边形边上的点数,S表示多边形的面积. 满足:S:=I+E/2-1; 解决这一类题可能运用到的: 求E,一条边(x1,y1,x2,y2)上 ...

  4. NT式驱动和WDM式驱动

    刚开始学习驱动,没什么基础,对于好多名词也不是很理解,感觉每天学的驱动都不一样.......今天看了书之后才知道,原来驱动分为NT式驱动和WDM式驱动两种.大概总结一下它们之间的区别. 对于NT式驱动 ...

  5. Python与金融分析基础

    一 .ipython的简单使用 IPython:交互式的Python命令行 丰富的快捷键 TAB键自动完成 ?:内省.命名空间搜索 !:执行系统命令 魔术命令:以%开始的命令 %run:执行文件代码 ...

  6. iOS float小数四舍五入

    http://blog.csdn.net/fanjunxi1990/article/details/21536189 直接贴代码了 #import "ViewController.h&quo ...

  7. linux驱动学习(八) i2c驱动架构(史上最全) davinc dm368 i2c驱动分析【转】

    转自:http://blog.csdn.net/ghostyu/article/details/8094049 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 预备知识 lin ...

  8. POI导入导出小案例

    一.HSSF 97-2003 需要jar:poi-3.9.jar 简单示例:生成EXCEL //93---2003 String [] titlie={"id","nam ...

  9. python数据类型-----列表

    今天来总结下python3.4版本列表的一些操作方法. 列表(list): 1.列表就像一个线性容器,但是比C++的 lis t扩展多得多,列表里的元素可以是相同类型,也可以包含各种类型,比如列表里嵌 ...

  10. [ Linux 命令 ] grep

    一.grep是什么? Linux grep命令是用于查找文件里符合条件行的shell命令. 二.为什么要使用grep? 在查找文件内容时候,通过使用grep指定条件,可以快速定位到文件里字符串所在的行 ...