$\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. 桥接物理网卡,pipwork指定ip,外网连接,研究salt+docker

    1.桥接物理网卡: 首先下载工具: yum -y install --enablerepo=epel bridge-utils 停止服务: 983 systemctl stop docker 删除do ...

  2. 跨域请求json数据

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

  3. 计算1-1/x+1/x*x

    // algo1-1.cpp 计算1-1/x+1/x*x. #include<stdio.h> #include<sys/timeb.h> void main() { time ...

  4. mpvue基本使用

    ## 什么是mpvue ## - 美团开发使用vue语法开发小程序的前端框架 - 适用于vue语法开发 - 会调用部分小程序API ## 创建mpvue项目 ## 1. 必须安装node.js 2.  ...

  5. 在eclipse中使用JUnit4,以及使用JUnit4进行单元测试的技巧

    一 在eclipse中使用JUnit4 首先在工程上右键,选择属性,找到Java Builder Path,添加JUnit4的lib,如下图:   在要测试的类上右键新建 Junit test cas ...

  6. POJ 1064---二分搜索法

    ///2.假定一个解并判断是否可行 ///POJ1064 /** Q:有N条绳子,长度分别为Li,从中切割出k条长度相同的绳子, 这K条绳子最长能有多长?保留两位小数 A: 二分搜索模型. 条件C(x ...

  7. set .net principle

    var ticket = new FormsAuthenticationTicket(1, username, DateTime.Now, DateTime.Now.AddMinutes(FormsA ...

  8. (二十八)fopen与读写的标识r,r+,rb+,rt+,w+.....

    fopen与读写的标识r,r+,rb+,rt+,w+..... 函数简介 函数功能: 打开一个文件 函数原型:FILE * fopen(const char * path,const char * m ...

  9. 利用cron监视后台进程状态

    利用cron监视后台进程状态 http://blog.csdn.net/dyx810601/article/details/72967758 1. 利用cron监视后台进程状态,如果进程死掉或服务器重 ...

  10. chromium源代码下载(Win7x64+VS2013sp2, 39.0.2132.2)

    chromium源代码下载(Win7x64+VS2013sp2, 39.0.2132.2) http://www.aichengxu.com/diannao/1000251.htm 前后折腾了四天,当 ...