2017 Multi-University Training Contest - Team 4——HDU6069&&Counting Divisors
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6069
题目意思:首先解释一下d[n]这个函数表示n有多少个因子,百度一下可以知道这个函数是一个非完全积性函数,d[n]=d[i]*d[j]当且仅当i*j=n,且i和j互质,现在求一个[l,r]区间的所有数d[i^k]的和。
思路:比赛场上知道xjb推出了题目给的这个公式d(n^k)=(kc1+1)(kc2+1)...(kcm+1),还是很容易推了的,可能百度也可以找到吧,还是自己推一下比较好。这里说一下是怎么退出来了。首先对于一个数n可以质因分解出n=p1^m1*p2^m2*p3^m3……ps^ms,其中p1,p2,p3…………ps是互不相同的质数,所以每一项都是互质的。
所以d[n]=d[p1^m1]*d[p2^m2]*d[p3^m3]……d[ps^ms]。又因为n^k=[p1^m1*p2^m2*p3^m3……ps^ms]*[p1^m1*p2^m2*p3^m3……ps^ms]…………*[p1^m1*p2^m2*p3^m3……ps^ms],k项相乘,合并一下可以得到n^k=p1^(m1*k)*p2^(m2*k)*p3^(m3*k)…………ps^(ms*k),我们知道对于一个素数有两个因数,而p^k(p为素数)的因子数为k+1,我们可以这样反推这个结论。因为一个数有唯一的质因分解,所以p^k的必然分解成k个p,那么所有的p^t(0<=t<=k)必定都是p^k的因数,而p^k的因数不会再有其他数了,所以一共k+1个因子。
由以上我们证明了d(n^k)=(kc1+1)(kc2+1)...(kcm+1)这个式子,我们现在关键就是把这个式子中的每一个数的每一个c1……cm算出来即可。很明显质因分解计算每个质因子的个数。但是这里用简单的计算不行,所以这道题需要用到区间素数筛,用sqrt(r)内的素数把[l,r]的素数筛出来,那些被筛掉的数必然是被自己的质因子筛掉的。还有一点一个数n的质因子最多只有一个在sqrt(n)的右侧。所以我们建立一个orz数组初始化orz[i-l]=l,然后每次计算一个质因子对他的贡献,就他这些质因子除掉。最后对于那些orz[i-l]!=1的只有两种情况要么是素数,要么是有一个质因子在sqrt(i-l)的右侧,我们只需要再把ans[i-l]*=k+1就好了。
筛素数的时候多筛点,我因为筛少了,导致wa了5发
代码:
//Author: xiaowuga
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mem(s,ch) memset(s,ch,sizeof(s))
const long long N=1e6+;
const long long mod=;
using namespace std;
typedef long long LL;
bool is_p_small[N];
bool is_p[N];
LL ans[N];
LL l,r,k;
LL orz[N];
LL prime[N];
LL p=;
void sieve(){
mem(is_p_small,true);
is_p_small[]=is_p_small[]=false;
for(LL i=;i<=N-;i++){
if(is_p_small[i]){
prime[p++]=i;
for(LL j=*i;j<=N-;j+=i) is_p_small[j]=false;
}
}
} void sement_sieve(LL a,LL b){
mem(is_p,true);
LL lim=ceil(sqrt(b));
for(LL i=;prime[i]<=lim;i++){
for(LL j=max(2LL,(a+prime[i]-)/prime[i])*prime[i];j<=b;j+=prime[i]){
is_p[j-a]=false;
LL res=;
while(orz[j-a]%prime[i]==){
orz[j-a]/=prime[i];
res++;
}
ans[j-a]=ans[j-a]*(res*k+)%mod;
}
}
}
int main(){
int T;
scanf("%d",&T);
sieve();
while(T--){
scanf("%lld%lld%lld",&l,&r,&k);
for(LL i=;i<=r-l+;i++) {ans[i]=;orz[i]=i+l;}
sement_sieve(l,r+);
LL sum=;
for(LL i=;i<=r-l;i++){
if(orz[i]!=) ans[i]=ans[i]*(k+);
}
for(LL i=;i<=r-l;i++){
sum=(sum+ans[i])%mod;
}
printf("%lld\n",sum);
}
return ;
}
2017 Multi-University Training Contest - Team 4——HDU6069&&Counting Divisors的更多相关文章
- 2017 Multi-University Training Contest - Team 4 hdu6069 Counting Divisors
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6069 题目: Counting Divisors Time Limit: 10000/5000 ...
- 【2017 Multi-University Training Contest - Team 4】Counting Divisors
[Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6069 [Description] 定义d(i)为数字i的因子个数; 求∑rld(ik) 其中l,r ...
- 2017 Multi-University Training Contest - Team 9 1005&&HDU 6165 FFF at Valentine【强联通缩点+拓扑排序】
FFF at Valentine Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 2017 Multi-University Training Contest - Team 9 1004&&HDU 6164 Dying Light【数学+模拟】
Dying Light Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...
- 2017 Multi-University Training Contest - Team 9 1003&&HDU 6163 CSGO【计算几何】
CSGO Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- 2017 Multi-University Training Contest - Team 9 1002&&HDU 6162 Ch’s gift【树链部分+线段树】
Ch’s gift Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- 2017 Multi-University Training Contest - Team 9 1001&&HDU 6161 Big binary tree【树形dp+hash】
Big binary tree Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- 2017 Multi-University Training Contest - Team 1 1003&&HDU 6035 Colorful Tree【树形dp】
Colorful Tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- 2017 Multi-University Training Contest - Team 1 1006&&HDU 6038 Function【DFS+数论】
Function Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ...
随机推荐
- iOS第三方开源库的吐槽和备忘
转自:http://blog.ibireme.com/2013/09/23/ios-third-party-libs/#more-41361 由 ibireme 发表于 2013/09/23 做iOS ...
- ENGINE_API CXSroll
#ifndef __XSROLL_H__ #define __XSROLL_H__ #include "CocoHead.h" #include "XWindow.h&q ...
- 使用 ChromaKey 滤镜进行抠图
简介 Nokia Imaging SDK 1.0 中新提供的 ChromaKey 滤镜是一个神奇的滤镜,它的基本原理就是把 一个指定范围值内的颜色变为透明或半透明,比如下面的 demo 演示的,看上 ...
- DOM方法 getElementsByName()方法
http://www.imooc.com/code/1583 getElementsByName()方法 返回带有指定名称的节点对象的集合. 语法: document.getElementsByNam ...
- nyoj16矩形嵌套(第一道dp关于dag的题目)
http://acm.nyist.net/JudgeOnline/problem.php?pid=16 题意:有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c, ...
- 关于报错“syntax error near unexpected token `”和回车换行
本来是很简单一个事情,转过来是因为打字机这事比较有趣…… http://blog.csdn.net/xyp84/archive/2009/08/11/4435899.aspx 摘要一下: 回车 换行 ...
- Mac下修改应用程序的菜单快捷键!
点击左上角苹果按钮,系统偏好设置 > 键盘 > 快捷键 > 应用快捷键 点击右下角添加按钮,选择chrome程序,输入菜单中文名以及快捷键 1.如何用F5刷新 鼠标悬停在左上角的刷新 ...
- 绝对详细!Nginx基本配置、性能优化指南
大多数的Nginx安装指南告诉你如下基础知识——通过apt-get安装,修改这里或那里的几行配置,好了,你已经有了一个Web服务器了!而且,在大多数情况下,一个常规安装的nginx对你的网站来说已经能 ...
- Nginx服务器防止被压力测试
最近经常用人帮忙做压力测试,用webbech或者ab等一些工具模拟并发压服务器,若服务器没有限制连接数或带宽,服务器很容易被压跨.cat nginx.conf…http {…limit_conn_zo ...
- Hadoop2.x Yarn作业提交(客户端)
转自:http://blog.csdn.net/lihm0_1/article/details/22186833 YARN作业提交的客户端仍然使用RunJar类,和MR1一样,可参考 http://b ...