HDU 6169 Senior PanⅡ 数论+DP
来源:互联网 发布:网络交换机类型的杂志 编辑:程序博客网 时间:2024/06/15 22:26
题目链接
题意:给定区间
限制:
思路:
首先考虑当
然后考虑
对于任意一个
因
故只需要计算
考虑
则:
解释:对于
对于
其中
然后最终答案就等于:(若
因为
非常感谢评论区dalao @just_sort的分享和指正。
对于此题,其实存在一个非常优秀的剪枝思路,能够大大减低复杂度。
若第
其实理解起来也很简单。
对于
考虑每一个合数,其最小质因子也一定在前
唯一特殊的值就是
故剪枝的正确性成立。
修正后的代码:
#include<cstdio>#include<cmath>using namespace std;typedef long long ll;const ll mod = 1e9 + 7;const ll Mx = 320000;const int A = 320000 + 10;const int B = 1e4 + 10;const int C = 1e2 + 10;ll dp[B][C],inv2;int pri[A],tot;bool vis[A];ll fast_pow(ll n,ll m){ ll res = 1; while(m){ if(m&1) res = (res*n)%mod; n = n*n%mod; m>>=1; } return res;}void init(){ tot = 0; for(int i=2 ;i<A ;i++){ if(!vis[i]){pri[++tot] = i;} for(int j=1 ;j<=tot && i*pri[j]<A ;j++){ vis[i*pri[j]] = 1; if(i % pri[j] == 0) break; } } inv2 = fast_pow(2,mod-2); //求逆元 for(int i=1 ;i<B ;i++){ dp[i][0] = 1LL*i*(i+1)/2%mod; for(int j=1 ;j<C ;j++){ dp[i][j] = (dp[i][j-1] - pri[j]*dp[i/pri[j]][j-1]%mod)%mod; if(dp[i][j] < 0) dp[i][j] += mod; } }}ll dfs(ll n,ll m){ if(n<=1) return n; if(!m) return n%mod*(n%mod+1)%mod*inv2%mod; if(n < B && m < C) return dp[n][m]; if(m && pri[m] >= n) return 1; return (dfs(n,m-1) - pri[m]*dfs(n/pri[m],m-1)%mod)%mod;}bool isprime(ll x){ for(ll i=2 ;i*i<=x ;i++){ if(x % i == 0) return false; } return true;}int main(){ init(); int T,_=1;scanf("%d",&T); while(T--){ ll L,R,K; scanf("%I64d%I64d%I64d",&L,&R,&K); printf("Case #%d: ",_++); if(!isprime(K)) puts("0"); else if(K>Mx){ if(L<=K && K<=R) printf("%I64d\n",K%mod); else puts("0"); } else{ int now = 0; while(pri[now+1] < K) now++; ll ans = (dfs(R/K,now)*K%mod - dfs((L-1)/K,now)*K%mod)%mod; if(ans < 0) ans += mod; printf("%I64d\n",ans); } } return 0;}
- HDU 6169 Senior PanⅡ 数论+DP
- HDU 6166 Senior Pan
- HDU 6166 Senior Pan
- [HDU 6166] Senior Pan
- HDU 6166 Senior Pan
- hdu-6166 Senior Pan
- HDU 6166 Senior Pan
- Senior Pan HDU
- HDU 6166 Senior Pan
- Senior Pan HDU
- HDU-6166 Senior Pan
- hdu 6166 Senior Pan 最短路
- hdu 6166 Senior Pan(巧妙的Dijkstra)
- HDU 6166 Senior Pan (2017多校9
- hdu 6166 Senior Pan(最短路)
- [hdu 6166 Senior Pan]Dijkstra+概率随机
- HDU 6166 Senior Pan [二分+SPFA]
- HDU 6166 Senior Pan(SPFA+二进制分组)
- Servlet——Session(1)之基础知识
- linux内核 驱动 硬件
- Github简易教程
- 二分查找
- Linux里新建文件/目录的默认权限
- HDU 6169 Senior PanⅡ 数论+DP
- HDU
- MySql常用命令总结
- Java中类、抽象类、接口的联系与区别
- 《代码整洁之道》学习小结(一)
- HDU 6168 Numbers
- 项目中用到的日历控件
- lua 二维数组
- Java中的异常处理