hdu 6069 区间筛
来源:互联网 发布:fedora17 yum无法使用 编辑:程序博客网 时间:2024/06/11 07:04
题意:求出i满足l到r区间所有 i^k次方的因子的数量的和。
思路:对10^6的区间进行素数筛, 求出其质因数,再根据每个质因数的(1+number*k)的乘积求出因子和。
#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>using namespace std;const int MAXN = 1e6+1e3; bool vis[MAXN];typedef long long LL;const int mod = 998244353;LL num[MAXN];LL prime[MAXN];LL a[MAXN];int cnt;void seg_vis(LL l,LL r, int k) //区间筛法{ LL n=r-l; for(LL i=0; i<=n; i++) num[i]=1, a[i]=l+i; for (LL i=0; prime[i]<=n+1&&i<cnt; i++) { LL j = 0; if (l % prime[i] != 0)//第一个需要筛掉的数(j+a) % isprime[i] == 0 j = prime[i] - l % prime[i]; for (; j<=n; j+=prime[i]) { LL Count = 0; while(a[j]%prime[i]==0) { Count++; a[j]/=prime[i]; } num[j]=(num[j]*(k*Count+1))%mod; } } LL sum=0; for(LL i=0; i<=n; ++i) { if(a[i]!=1) num[i]=num[i]*(k+1)%mod; sum=(sum+num[i])%mod; } printf("%lld\n", sum); return ;}int main(){ cnt=0; memset(vis, true, sizeof(vis)); for(int i=2; i<MAXN; i++) //预处理 if(vis[i]) { prime[cnt++]=i; for(int j=2*i; j<MAXN; j+=i) vis[j]=false; } LL l, r; int t; int k; scanf("%d", &t); while(t--) { scanf("%lld %lld %d", &l, &r, &k); seg_vis(l, r, k); } return 0;}
阅读全文
0 0
- hdu 6069 区间筛
- hdu 6069 区间筛
- HDU 6069 数学题,区间素数筛
- hdu 6069 Counting Divisors(区间筛)
- HDU 6069 数论 区间素数筛(+赛后反思
- HDU 6069 Counting Divisors(枚举区间)(素数筛模版)
- 埃氏筛法,区间筛法,hdu 2136
- HDU 6069 Counting Divisors【区间素筛】【经典题】【好题】
- Hdu 6069 Counting Divisors【素数区间筛+预处理素因子分解】
- hdu 1698 区间更新
- hdu 1540 区间合并
- hdu 区间dp 2476
- hdu 4283 区间DP
- HDU 2476 区间dp
- HDU 4283 区间DP
- HDU 2476 区间DP
- hdu 4293 区间dp
- hdu 4883 区间选点
- 利用pdfbox和itext包将pdf转换为图片
- SparkSQL---DataFrame
- Date、String、Calendar类型之间的转化
- 2017/8/3java开发日志
- Webpack+React+ES6项目搭建(一)
- hdu 6069 区间筛
- java数组中的length属性到底属于java中的哪个类
- keystore was tampered with,or password was incorrect解决办法
- 码云,git使用 教程
- spring security入门程序----登录
- Spring容器管理对象
- Python学习笔记(1)——Pylatin
- java学习初探2之语言基础(3)
- 详细解析oracle中left join,right join,inner join用法