hdu 6069 区间筛
2017-08-03 18:43
330 查看
题意:求出i满足l到r区间所有 i^k次方的因子的数量的和。
思路:对10^6的区间进行素数筛, 求出其质因数,再根据每个质因数的(1+number*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; }
相关文章推荐
- HDU 6069 Counting Divisors(枚举区间)(素数筛模版)
- Hdu 6069 - Counting Divisors(区间筛质因子)
- HDU 6069 Counting Divisors(区间素数筛法)
- (2017多校训练第四场)HDU - 6069 Counting Divisors 区间筛
- [hdu 6069]素数筛+区间质因数分解
- HDU 6069 数学题,区间素数筛
- HDU-6069 Counting Divisors - 2017 Multi-University Training Contest - Team 4(分解质因子区间筛法)
- hdu 6069 Counting Divisors(区间筛)
- HDU 6069 数论 区间素数筛(+赛后反思
- hdu 6069 Counting divisors 公式+区间筛
- HDU 6069 Counting Divisors【区间素筛】【经典题】【好题】
- hdu 6069 统计区间约数的个数 2017 Multi-University Training Contest - Team 4
- hdu 6069 区间筛
- HDU 6069 求区间[L,R]每个数的k次方的因子数之和
- Hdu 6069 Counting Divisors【素数区间筛+预处理素因子分解】
- HDU 1686 Oulipo (KMP查找可交叉区间模式串)
- hdu 5115 区间dp 狼BUFF
- HDU 1892 See you~(二维树状数组的单点更新,区间求值)
- 【区间更新区间求和】HDU 1698 Just a Hook
- HDU 5475 An easy problem (线段树)(单点更新,区间查询)2015ICPC 上海网赛