HDU 6169 Senior PanⅡ(数论+dp)
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)相关推荐
- HDU 6169 Senior PanⅡ 数论+DP
题目链接 题意:给定区间[L,R][L,R][L,R]和一个整数KKK,问区间内所有满足其最小因子(111除外)为KKK的数的和. 限制:L,R,K(<=1e11)L,R,K(<=1e11 ...
- 2017多校第9场 HDU 6169 Senior PanⅡ 数论,DP,爆搜
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6169 题意:给了区间L,R,求[L,R]区间所有满足其最小质数因子为k的数的和. 解法: 我参考的这篇 ...
- HDU - 6169 Senior PanⅡ(dp+数论)
题目大意: 多组测试数据,每组给你三个数:l,r,k;让你输出区间 [ l , r ] 内所有最小不为 1 的因数是 k 的数的和.(l,r,k≤1011)(l,r,k \le 10^{11}) 分析 ...
- hdu 6169 DP
传送门 Senior PanⅡ Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others ...
- 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 ...
- HDU 1231.最大连续子序列-dp+位置标记
最大连续子序列 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- 数学--数论--HDU6919 Senior PanⅡ【2017多校第九场】
Description 给出一个区间[L,R][L,R],问该区间中所有以KK作为最小因子(大于11的)的数字之和 Input 第一行输入一整数TT表示用例组数,每组用例输入三个整数L,R,KL,R, ...
- HDU 6166 2017 多校训练:Senior Pan(最短路)
题意: 有一张n个点m条边的有向图,还有一个包含k个点的点集,求出这个点集中任意两点间最短路的最小值 官方题解看不懂.. 如果一条边的两个端点都在这个集合中,就将这条边直接删掉(中间记录下最小值)以后 ...
- HDU 6156 Palindrome Function 数位DP
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6156 题目描述: 求L~R所有的数的l~r进制的f(x), f(x) = 当前进制 如果回文串, f ...
最新文章
- python fft库有哪些_Python图像处理库PIL中快速傅里叶变换FFT的实现(一)
- 【mysql】使用tpcc-mysql进行压力测试
- 如何调整ABAP程序的性能
- 看微信了解MySQL及相关IT技术
- 土压力图怎么画_电气系统图怎么画?
- elasticsearch docker无法挂载_ElasticSearch数据备份与恢复
- wetask.cn领度任务全新试用体验
- 【免费下载】2021年9月热门报告盘点(附热门报告列表及下载链接)
- 区块链只能算半个“信任机器”,隐私计算才是真正的信任机器?
- Shell命令-线上查询及帮助之man、help
- coreldraw快速撤回_CorelDRAW操作技巧,教你CDR撤销操作方法与设置技巧
- 经典的Java算法面试题
- Java实现多元t分布函数(Multivariate t distributions)
- php guzzlehttp,使用Guzzle执行HTTP请求
- 《Netkiller Spring Cloud 手札》之 Spring Cloud Consol
- 计算机开机进不去桌面,电脑开机直接跳过启动界面进去电脑桌面,想进bios进不去怎么办...
- java tt自行车_骑行圈的知识科普:“大组车”和“TT”车的区别
- 200 一步步开始学习制作PCBPCBA--绘制原理图
- PHP 基于XLSXWriter的多级表头Excel导出
- Ubuntu系统拼音无法正确打字怎么解决?