Description

给出一个区间[L,R][L,R][L,R],问该区间中所有以KKK作为最小因子(大于1" role="presentation" style="position: relative;">111的)的数字之和

Input

第一行输入一整数TTT表示用例组数,每组用例输入三个整数L,R,K" role="presentation" style="position: relative;">L,R,KL,R,KL,R,K(1≤L≤R≤1011,2≤K≤1011)(1≤L≤R≤1011,2≤K≤1011)(1\le L\le R\le 10^{11},2\le K\le 10^{11})

Output

对于每组用例,输出答案,结果模109+7109+710^9+7

Sample Input

2
1 20 5
2 6 3

Sample Output

Case #1: 5
Case #2: 3

Solution

显然kkk需要是素数,否则不存在数字以K" role="presentation" style="position: relative;">KKK为最小因子,且如果KKK是N" role="presentation" style="position: relative;">NNN的因子,那么N/KN/KN/K也是NNN的因子,进而有K≤N/K" role="presentation" style="position: relative;">K≤N/KK≤N/KK\le N/K,故K≤N−−√K≤NK\le \sqrt{N},即如果K>1011−−−−√≈320000K>1011≈320000K>\sqrt{10^{11}}\approx 320000时,至多有一个数字(即KKK本身)以K" role="presentation" style="position: relative;">KKK为最小因子,当K≤320000K≤320000K\le 320000时,只需解决111~N" role="presentation" style="position: relative;">NNN中以KKK为最小素因子的数字之和即可

考虑dp" role="presentation" style="position: relative;">dpdpdp,以dp[i][j]dp[i][j]dp[i][j]表示前iii个数字中没有以前j" role="presentation" style="position: relative;">jjj个素数为最小素因子的数字之和,假设KKK是第pos+1" role="presentation" style="position: relative;">pos+1pos+1pos+1个因子,如果一个数字XXX以K" role="presentation" style="position: relative;">KKK为最小素因子,那么X/KX/KX/K必然不以前pospospos个素数为最小素因子,反之,如果YYY不以前pos" role="presentation" style="position: relative;">pospospos个素因子为最小素因子,则YKYKYK必然以KKK为最小素因子,那么我们只要求1" role="presentation" style="position: relative;">111~⌊NK⌋⌊NK⌋\lfloor\frac{N}{K}\rfloor中没有以前pospospos个素数为最小素因子的数字之和,乘上KKK即为1" role="presentation" style="position: relative;">111~NNN中以K" role="presentation" style="position: relative;">KKK为最小素因子的数字之和,且同理可以得到转移方程,前iii个数字中不以前j" role="presentation" style="position: relative;">jjj个素数为最小素因子的数字之和===前i" role="presentation" style="position: relative;">iii个数字中不以前j−1j−1j-1个素数为最小素因子的数字之和−−-前i" role="presentation" style="position: relative;">iii个数字中以第jjj个素数为最小素因子的数字之和,即dp[i][j]=dp[i][j−1]−pj⋅dp[⌊ipj⌋][j−1]" role="presentation" style="position: relative;">dp[i][j]=dp[i][j−1]−pj⋅dp[⌊ipj⌋][j−1]dp[i][j]=dp[i][j−1]−pj⋅dp[⌊ipj⌋][j−1]dp[i][j]=dp[i][j-1]-p_j\cdot dp[\lfloor\frac{i}{p_j}\rfloor][j-1]

Code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
#define M 320000
#define mod 1000000007
#define inv2 500000004
#define A 8000
#define B 1000
int res=0,p[M+5],mark[M+5],dp[A+5][B+5];
int ins(int x,int y)
{return x+y>=mod?x+y-mod:x+y;
}
int des(int x,int y)
{return x-y<0?x-y+mod:x-y;
}
void init()
{for(int i=2;i<=M;i++)if(!mark[i]){p[++res]=i;for(int j=2*i;j<=M;j+=i)mark[j]=1;}dp[0][0]=0;for(int i=1;i<=A;i++){dp[i][0]=ins(dp[i-1][0],i);for(int j=1;j<=B;j++)dp[i][j]=des(dp[i][j-1],(ll)p[j]*dp[i/p[j]][j-1]%mod);}
}
bool check(ll n)
{if(n<=M)return mark[n]^1;for(int i=1;i<=res&&(ll)p[i]*p[i]<=n;i++)if(n%p[i]==0)return 0;return 1;
}
int Solve(ll n,int m)
{if(n<2)return n;if(m==0){n%=mod;return n*(n+1)%mod*inv2%mod;}if(n<=A&&m<=B)return dp[n][m];if(n<=p[m])return 1;return des(Solve(n,m-1),(ll)p[m]*Solve(n/p[m],m-1)%mod);
}
int main()
{init();int T,Case=1;scanf("%d",&T);while(T--){ll L,R,K;scanf("%I64d%I64d%I64d",&L,&R,&K);printf("Case #%d: ",Case++);if(!check(K))printf("0\n");else if(K>M){if(K>=L&&K<=R)printf("%d\n",K%mod);else printf("0\n");}else{int pos=1;while(p[pos]<K)pos++;pos--;int ans=des(K*Solve(R/K,pos)%mod,K*Solve((L-1)/K,pos)%mod);printf("%d\n",ans);}}return 0;
}

HDU 6169 Senior PanⅡ(数论+dp)相关推荐

  1. HDU 6169 Senior PanⅡ 数论+DP

    题目链接 题意:给定区间[L,R][L,R][L,R]和一个整数KKK,问区间内所有满足其最小因子(111除外)为KKK的数的和. 限制:L,R,K(<=1e11)L,R,K(<=1e11 ...

  2. 2017多校第9场 HDU 6169 Senior PanⅡ 数论,DP,爆搜

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6169 题意:给了区间L,R,求[L,R]区间所有满足其最小质数因子为k的数的和. 解法: 我参考的这篇 ...

  3. HDU - 6169 Senior PanⅡ(dp+数论)

    题目大意: 多组测试数据,每组给你三个数:l,r,k;让你输出区间 [ l , r ] 内所有最小不为 1 的因数是 k 的数的和.(l,r,k≤1011)(l,r,k \le 10^{11}) 分析 ...

  4. hdu 6169 DP

    传送门 Senior PanⅡ Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others ...

  5. hdu 6169 gems gems gems【DP】

    题目链接:hdu 6169 gems gems gems Now there are n gems, each of which has its own value. Alice and Bob pl ...

  6. HDU 1231.最大连续子序列-dp+位置标记

    最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  7. 数学--数论--HDU6919 Senior PanⅡ【2017多校第九场】

    Description 给出一个区间[L,R][L,R],问该区间中所有以KK作为最小因子(大于11的)的数字之和 Input 第一行输入一整数TT表示用例组数,每组用例输入三个整数L,R,KL,R, ...

  8. HDU 6166 2017 多校训练:Senior Pan(最短路)

    题意: 有一张n个点m条边的有向图,还有一个包含k个点的点集,求出这个点集中任意两点间最短路的最小值 官方题解看不懂.. 如果一条边的两个端点都在这个集合中,就将这条边直接删掉(中间记录下最小值)以后 ...

  9. HDU 6156 Palindrome Function 数位DP

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6156 题目描述: 求L~R所有的数的l~r进制的f(x), f(x) = 当前进制 如果回文串, f ...

最新文章

  1. python fft库有哪些_Python图像处理库PIL中快速傅里叶变换FFT的实现(一)
  2. 【mysql】使用tpcc-mysql进行压力测试
  3. 如何调整ABAP程序的性能
  4. 看微信了解MySQL及相关IT技术
  5. 土压力图怎么画_电气系统图怎么画?
  6. elasticsearch docker无法挂载_ElasticSearch数据备份与恢复
  7. wetask.cn领度任务全新试用体验
  8. 【免费下载】2021年9月热门报告盘点(附热门报告列表及下载链接)
  9. 区块链只能算半个“信任机器”,隐私计算才是真正的信任机器?
  10. Shell命令-线上查询及帮助之man、help
  11. coreldraw快速撤回_CorelDRAW操作技巧,教你CDR撤销操作方法与设置技巧
  12. 经典的Java算法面试题
  13. Java实现多元t分布函数(Multivariate t distributions)
  14. php guzzlehttp,使用Guzzle执行HTTP请求
  15. 《Netkiller Spring Cloud 手札》之 Spring Cloud Consol
  16. 计算机开机进不去桌面,电脑开机直接跳过启动界面进去电脑桌面,想进bios进不去怎么办...
  17. java tt自行车_骑行圈的知识科普:“大组车”和“TT”车的区别
  18. 200 一步步开始学习制作PCBPCBA--绘制原理图
  19. PHP 基于XLSXWriter的多级表头Excel导出
  20. Ubuntu系统拼音无法正确打字怎么解决?

热门文章

  1. 测试设计中需要考虑的22种测试类型 --
  2. 手机IMEI是什么?有什么作用?如何检查它?
  3. 手机移动端可滚动的导航代码--css解决方案
  4. [Pandas] 多行合并成一行
  5. CameraX 三:获取预览流
  6. apk copy 文件到 otg U盘, 正常通过umount移除后数据变为0KB的问题
  7. php画圆盘,用Canvas画个圆盘
  8. RSS工具关注期刊,方便快速获取及时大量的文献信息
  9. MIM,MOM和MOS电容的区别
  10. 智慧政务大数据分析平台HTML模板