Codeforces 235E Number Challenge
http://codeforces.com/contest/235/problem/E
远距离orz......rng_58
证明可以见这里(可能要翻墙才能看到)
还是copy一下证明吧:
记
$$f(a,b,c)=\sum\limits_{i=1}^{a}\sum\limits_{j=1}^{b}\sum\limits_{k=1}^{c}d(ijk)$$
和
$$g(a,b,c)=\sum\limits_{gcd(i,j)=gcd(j,k)=gcd(i,k)=1}\left \lfloor \frac{a}{i} \right \rfloor\left \lfloor \frac{b}{j} \right \rfloor\left \lfloor \frac{c}{k} \right \rfloor$$
我们先证明下面的等式:
$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)$
$=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)$
根据容斥原理,我们容易知道
$$等式左边=d(abc)$$
我们继续化简一下等式右边(可能有点长,不过很好理解):
$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_{gcd(i,j)=gcd(j,k)=gcd(i,k)=1}(\left \lfloor \frac{a}{i} \right \rfloor\left \lfloor \frac{b}{j} \right \rfloor\left \lfloor \frac{c}{k} \right \rfloor-\left \lfloor \frac{a-1}{i} \right \rfloor\left \lfloor \frac{b}{j} \right \rfloor\left \lfloor \frac{c}{k} \right \rfloor-\left \lfloor \frac{a}{i} \right \rfloor\left \lfloor \frac{b-1}{j} \right \rfloor\left \lfloor \frac{c}{k} \right \rfloor-\left \lfloor \frac{a}{i} \right \rfloor\left \lfloor \frac{b}{j} \right \rfloor\left \lfloor \frac{c-1}{k} \right \rfloor+\left \lfloor \frac{a-1}{i} \right \rfloor\left \lfloor \frac{b-1}{j} \right \rfloor\left \lfloor \frac{c}{k} \right \rfloor+\left \lfloor \frac{a-1}{i} \right \rfloor\left \lfloor \frac{b}{j} \right \rfloor\left \lfloor \frac{c-1}{k} \right \rfloor+\left \lfloor \frac{a}{i} \right \rfloor\left \lfloor \frac{b-1}{j} \right \rfloor\left \lfloor \frac{c-1}{k} \right \rfloor-\left \lfloor \frac{a-1}{i} \right \rfloor\left \lfloor \frac{b-1}{j} \right \rfloor\left \lfloor \frac{c-1}{k} \right \rfloor)$
因式分解得:
$=\sum\limits_{gcd(i,j)=gcd(j,k)=gcd(i,k)=1}(\left \lfloor \frac{a}{i} \right \rfloor-\left \lfloor \frac{a-1}{i} \right \rfloor)(\left \lfloor \frac{b}{i} \right \rfloor-\left \lfloor \frac{b-1}{i} \right \rfloor)(\left \lfloor \frac{c}{i} \right \rfloor-\left \lfloor \frac{c-1}{i} \right \rfloor)$
容易知道,当且仅当$a\%i=0$时,$\left \lfloor \frac{a}{i} \right \rfloor-\left \lfloor \frac{a-1}{i} \right \rfloor=1$,其他时候为$0$。$\left \lfloor \frac{b}{i} \right \rfloor-\left \lfloor \frac{b-1}{i} \right \rfloor$和$\left \lfloor \frac{c}{i} \right \rfloor-\left \lfloor \frac{c-1}{i} \right \rfloor$也是如此。
很好,所以:
$$等式右边=|\{(i,j,k)|gcd(i,j)=gcd(j,k)=gcd(i,k)=1且a\%i=b\%j=c\%k=0\}|$$
$$(即满足gcd(i,j)=gcd(j,k)=gcd(i,k)=1且a\%i=b\%j=c\%k=0的三元组(i,j,k)的个数)$$
我们复习一下约数和定理:
记$P_i$为第$i$个质数,显然$P_1=2,P_2=3,P_3=5,P_4=7......$
对于质数$P_i$,记$x_i$是满足$a\%P_i^{x_i}=0$的最大数。类似地,记$y_i$是满足$b\%P_i^{y_i}=0$的最大数,记$z_i$是满足$c\%P_i^{z_i}=0$的最大数。
根据约数和定理,$d(abc)=\prod\limits_{i=1}^{oo}(x_i+y_i+z_i+1)$
我们回过头来看我们的等式的右边:
$$等式右边=|\{(i,j,k)|gcd(i,j)=gcd(j,k)=gcd(i,k)=1且a\%i=b\%j=c\%k=0\}|$$
$$(即满足gcd(i,j)=gcd(j,k)=gcd(i,k)=1且a\%i=b\%j=c\%k=0的三元组(i,j,k)的个数)$$
我们试着构造出这个集合。
我们先将三元组$(i,j,k)$中的$i,j,k$分别质因数分解:
$i=P_1^{i_1}\times P_2^{i_2}\times P_3^{i_3}\times P_4^{i_4}......$
$j=P_1^{j_1}\times P_2^{j_2}\times P_3^{j_3}\times P_4^{j_4}......$
$k=P_1^{k_1}\times P_2^{k_2}\times P_3^{k_3}\times P_4^{k_4}......$
我们先考虑$P_1和i,j,k的质因子P_1的幂P_1^{i_1},P_1^{j_1},P_1^{k_1}$
因为$gcd(i,j)=gcd(j,k)=gcd(i,k)=1且a\%i=b\%j=c\%k=0$
所以三元组$(i_1,j_1,k_1)$总共有$x_1+y_1+z_1+1$种:
$(0,0,0)$,有1种
$(1,0,0),(2,0,0),(3,0,0),...,(x_1,0,0)$,有$x_1$种
$(0,1,0),(0,2,0),(0,3,0),...,(0,y_1,0)$,有$y_1$种
$(0,0,1),(0,0,2),(0,0,3),...,(0,0,z_1)$,有$z_1$种
类似地,三元组$(i_2,j_2,k_2)$有$x_2+y_2+z_2+1$种,三元组$(i_3,j_3,k_3)$有$x_3+y_3+z_3+1$种......
根据乘法原理,所以恰好就是$\prod\limits_{i=1}^{oo}(x_i+y_i+z_i+1)$
又因为$等式左边=d(abc)=\prod\limits_{i=1}^{oo}(x_i+y_i+z_i+1)=等式右边$
所以
$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)$
$=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)$
很好,我们已经证明了这个等式了。
然后用简单的数学归纳法,我们可以得到
$$f(a,b,c)=g(a,b,c)$$
所以
$\sum\limits_{i=1}^{a}\sum\limits_{j=1}^{b}\sum\limits_{k=1}^{c}d(ijk)=\sum\limits_{gcd(i,j)=gcd(j,k)=gcd(i,k)=1}\left \lfloor \frac{a}{i} \right \rfloor\left \lfloor \frac{b}{j} \right \rfloor\left \lfloor \frac{c}{k} \right \rfloor$
好神奇。。。。。。
而且这东西还能推广到任意维:
$\sum\limits_{i=1}^{a}d(i)=\sum\limits_{}\left \lfloor \frac{a}{i} \right \rfloor$
$\sum\limits_{i=1}^{a}\sum\limits_{j=1}^{b}d(ij)=\sum\limits_{gcd(i,j)=1}\left \lfloor \frac{a}{i} \right \rfloor\left \lfloor \frac{b}{j} \right \rfloor$
$\sum\limits_{i=1}^{a}\sum\limits_{j=1}^{b}\sum\limits_{k=1}^{c}d(ijk)=\sum\limits_{gcd(i,j)=gcd(j,k)=gcd(i,k)=1}\left \lfloor \frac{a}{i} \right \rfloor\left \lfloor \frac{b}{j} \right \rfloor\left \lfloor \frac{c}{k} \right \rfloor$
......
先看一道题放松一下。
好,回到本题。
先介绍一种比较简单的超时的方法。
记$g(x,y)=\sum\limits_{i=1}^{x}\sum\limits_{j=1}^{y}d(ij)$
我们可以在$O(\sqrt{N})$的时间内完成。
记$s(n,r)=\sum\limits_{i=1}^{r}d(in)$
容易知道$s(n,r)=g(n,r)-g(n-1,r)$,所以也可以在$O(\sqrt{N})$的时间完成。
那么原问题就是:
$$\sum\limits_{i=1}^{a}\sum\limits_{j=1}^{b}\sum\limits_{k=1}^{c}d(ijk)=\sum\limits_{i=1}^{a}\sum\limits_{j=1}^{b}s(ij,c)$$
直接枚举$i$和$j$,然后算$s(ij,c)$,时间复杂度是$O(N^{\frac{5}{2}})$。
好吧,这种方法是超时。
2015.11.12
经过wck大神的提点,终于A这道题了。
$\sum\limits_{gcd(i,j)=gcd(j,k)=gcd(i,k)=1}\left \lfloor \frac{a}{i} \right \rfloor\left \lfloor \frac{b}{j} \right \rfloor\left \lfloor \frac{c}{k} \right \rfloor$
$=\sum\limits_{i}\left \lfloor \frac{a}{i} \right \rfloor\sum\limits_{(i,j)=1}\sum\limits_{(i,k)=1}\left \lfloor \frac{b}{j} \right \rfloor\left \lfloor \frac{c}{k} \right \rfloor[(j,k)==1]$
$=\sum\limits_{i}\left \lfloor \frac{a}{i} \right \rfloor\sum\limits_{(i,j)=1}\sum\limits_{(i,k)=1}\left \lfloor \frac{b}{j} \right \rfloor\left \lfloor \frac{c}{k} \right \rfloor\sum\limits_{d|j,d|k}\mu (d)$
$=\sum\limits_{i}\left \lfloor \frac{a}{i} \right \rfloor\sum\limits_{d}\mu (d)\sum\limits_{d|j,(i,j)=1}\left \lfloor \frac{b}{j} \right \rfloor \sum\limits_{d|k,(i,k)=1}\left \lfloor \frac{c}{k} \right \rfloor$
$记j=dj',k=dk',则:$
$\sum\limits_{i}\left \lfloor \frac{a}{i} \right \rfloor\sum\limits_{d}\mu (d)\sum\limits_{(i,dj')=1}\left \lfloor \frac{b}{dj'} \right \rfloor \sum\limits_{(i,dk')=1}\left \lfloor \frac{c}{dk'} \right \rfloor$
我们先枚举$i$和$d$,然后分别枚举求$\sum\limits_{(i,dj')=1}\left \lfloor \frac{b}{dj'} \right \rfloor$ 和 $\sum\limits_{(i,dk')=1}\left \lfloor \frac{c}{dk'} \right \rfloor$,我们枚举的次数只是是$b/d$和$c/d$
所以其实计算的次数只是$a*(b/1+b/2+...+b/b)<ablogb$,不超时。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>
#include<bitset>
#include<vector>
#include<functional>
#include<deque>
#include<cctype>
#include<climits>
#include<complex>
//#include<bits/stdc++.h>适用于CF,UOJ,但不适用于poj using namespace std; typedef long long LL;
typedef double DB;
typedef pair<int,int> PII;
typedef complex<DB> CP; #define mmst(a,v) memset(a,v,sizeof(a))
#define mmcy(a,b) memcpy(a,b,sizeof(a))
#define fill(a,l,r,v) fill(a+l,a+r+1,v)
#define re(i,a,b) for(i=(a);i<=(b);i++)
#define red(i,a,b) for(i=(a);i>=(b);i--)
#define ire(i,x) for(typedef(x.begin()) i=x.begin();i!=x.end();i++)
#define fi first
#define se second
#define m_p(a,b) make_pair(a,b)
#define p_b(a) push_back(a)
#define SF scanf
#define PF printf
#define two(k) (1<<(k)) template<class T>inline T sqr(T x){return x*x;}
template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;} inline int sgn(DB x){if(abs(x)<1e-)return ;return(x>)?:-;}
const DB Pi=acos(-1.0); int gint()
{
int res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
}
LL gll()
{
LL res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
} const int maxn=;
const LL MOD=; int a,b,c;
LL ans; int flag[maxn+],cnt,prime[maxn+],mul[maxn+];
void prepare(int n)
{
int i,j;
flag[]=;mul[]=;
re(i,,n)
{
if(!flag[i])prime[++cnt]=i,mul[i]=-;
for(j=;j<=cnt && prime[j]*i<=n;j++)
{
flag[prime[j]*i]=;
if(i%prime[j]==){mul[i*prime[j]]=;break;}else mul[i*prime[j]]=-mul[i];
}
}
} int gcd(int a,int b){return b==?a:gcd(b,a%b);} int main()
{
freopen("CF235E.in","r",stdin);
freopen("CF235E.out","w",stdout);
int i;
a=gint();b=gint();c=gint();
if(b<c)swap(b,c);
prepare(b);
int d,jp,kp;
re(i,,a)
re(d,,b)if(mul[d]!= && gcd(i,d)==)
{
LL rj=,rk=;
for(jp=;d*jp<=b;jp++)if(gcd(i,jp)==)(rj+=b/(d*jp))&=(MOD-);
for(kp=;d*kp<=c;kp++)if(gcd(i,kp)==)(rk+=c/(d*kp))&=(MOD-);
LL res=(a/i);
(res*=mul[d])&=(MOD-);
(res*=rj)&=(MOD-);
(res*=rk)&=(MOD-);
(ans+=res)&=(MOD-);
}
cout<<ans<<endl;
return ;
}
Codeforces 235E Number Challenge的更多相关文章
- 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 ...
- CodeForces 235E Number Challenge (莫比乌斯反演)
题意:求,其中d(x) 表示 x 的约数个数. 析:其实是一个公式题,要知道一个结论 知道这个结论就好办了. 然后就可以解决这个问题了,优化就是记忆化gcd. 代码如下: #pragma commen ...
- CF#235E. Number Challenge
传送门 可以理解为上一道题的扩展板.. 然后我们就可以YY出这样一个式子 ${\sum_{i=1}^a\sum_{j=1}^b\sum_{k=1}^cd(ijk)=\sum_{i=1}^a\sum_{ ...
- Easy Number Challenge(暴力,求因子个数)
Easy Number Challenge Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I ...
- Codeforces 235E
Codeforces 235E 原题 题目描述:设\(d(n)\)表示\(n\)的因子个数, 给定\(a, b, c\), 求: \[\sum_{i=1}^{a} \sum_{j=1}^{b} \su ...
- Codeforces Avito Code Challenge 2018 D. Bookshelves
Codeforces Avito Code Challenge 2018 D. Bookshelves 题目连接: http://codeforces.com/contest/981/problem/ ...
- 『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 ...
- Java实现 蓝桥杯 算法训练 Number Challenge(暴力)
试题 算法训练 Number Challenge 资源限制 时间限制:3.0s 内存限制:512.0MB 问题描述 定义d(n)为n的约数个数.现在,你有三个数a,b,c.你的任务是计算下面式子mod ...
- 【codeforces 235E】 Number Challenge
http://codeforces.com/problemset/problem/235/E (题目链接) 题意 给出${a,b,c}$,求${\sum_{i=1}^a\sum_{j=1}^b\sum ...
随机推荐
- js通用对象数组冒牌排序
数组对象通用 function sort(data, sortFiled, orderby) { var result = data, temp; for (var i = 0; i < res ...
- Genymotion 模拟器 VirtualBox
准备 介绍: 1.Genymotion安卓模拟器其实不是普通的模拟器,严格来说,genymotion是虚拟机,被网传定义为模拟器,加载APP的速度比较快,操作起来也很流畅.2.Genymotion依赖 ...
- 你以为你了解最常用的string.substring()的几个常见问题吗?
---恢复内容开始--- 前言: 1.项目中我们难免会用到各种对字符串的处理方法,可是你曾知道substring()这个用法别有洞天?你考虑过一下几个情况吗? 使用Substring()时的正确写法: ...
- C#判断网站运行状态是否正常
我使用的是控制台应用程序来监控网站的运行状态,通过判断网站请求头(HEAD)来判断是否运行正常 下面列出几种常见的网站状态码 StatusCode 数字表示 OK 200. OK 指示请求成功,且请求 ...
- Socket服务端口长连接最多能支持多少?
答案是无限的.视服务端的资源而不同. 以前一直认为服务端在Accept客户端连接后,会开启一个新的端口与客户端建立链路,但这是错误的.事实上,一个连路是由Server IP+server Port + ...
- asp.net微信开发第二篇----消息应答
当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上. 请注意: 1.关于重试的消息排重,推荐使用msgid排重. 2.微信服务器在五秒内收不到响应会断掉连接 ...
- github修改自己的昵称
由于刚接触github,不会用,就随便写了个昵称,后来想改,却不知道从哪里改,到百度搜结果都是说不能修改的(这里就不吐槽百度了),还是直接上图吧. 点击Settings,然后跳转到下面界面,点击Acc ...
- JSP学习笔记(1)
JSP本质就是一个servlet,当第一次接受到客户端请求时会被编译成对应的servlet,且对应的每个servlet在容器中只要一个实例. 1.1.JSP注释 <%-- JSP注释部分 --& ...
- Spring4.0学习笔记(5) —— 管理bean的生命周期
Spring IOC 容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务 Spring IOC 容器对Bean的生命周期进行管理的过程: 1.通过构造器或工厂方法 ...
- java学习笔记 (9) —— Struts2 国际化
1.Test.java package com.i18n; import java.util.Locale; public class Test1 { public static void main( ...