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. 探索推荐引擎内部的秘密,第 3 部分: 深入推荐引擎相关算法 - 聚类
  2. STM32F103V IWDG 独立看门狗操作
  3. 基于nginx-rtmp实现电视回看业务
  4. Workbox CLI v3.x 中文版
  5. java 迭代器的原理_java里Iterator的原理
  6. java 逻辑表达式 布尔_使用基本逻辑门实现布尔表达式
  7. linux之chsh命令
  8. 5gh掌上云计算认证不通过_5GH币项目介绍及评级分析
  9. python编程入门 适合于零基础朋友-Python不能帮你找到女朋友,却能让你成为有钱的单身狗。...
  10. IIS与ASP.NET Http Runtime Pipeline
  11. 学习Java,可以从事哪些岗位?
  12. SAS硬盘与SATA硬盘有什么区别
  13. Excel如何统计单元格中姓名个数
  14. 为你的TabBar添加Badge-感谢分享
  15. android vendor接口,HIDL众多service在那启动的--/vendor/etc/init/android.hardware.*@2.0-service.rc...
  16. 将标准的EclipseWTP项目转化成具有Gradle功能的EclipseWTP项目
  17. java微信个人订阅号发信息_微信个人公众号开发-java
  18. 2022年数字科技前沿应用趋势
  19. Pytorch学习(二)—— nn模块
  20. 定频APK--rftesttool的安装及设置步骤

热门文章

  1. ipad下载 ’爱思助手‘ ,连接数据线导入包
  2. 关于“任务管理器被管理员禁用”的解决方案
  3. diablo 2 resurrected安装指南
  4. 用fireworks画手绘式的架构图
  5. asp.net 嵌入realplayer
  6. devecostudio-windows-tool-3.0.0.800安装教程
  7. AutoGLuon学习笔记(一):环境配置与API初识
  8. ios android安全性分析,为什么android安全性比iOS差?有3个原因 - 区块网
  9. Asce‘s Summer Ranking No.11
  10. 【经典面试题】strcpy 函数的实现