HDU 6069 Counting Divisors(枚举区间)(素数筛模版)
2017-09-14 20:46
429 查看
本题两个关键点
1.要得知一个数有多少因子,假设他可以被分解为素因数
n = p1^c1*p2^c2+p3^c3…
那么他的因子数为(c1+1)(c2+1)+…+(ck+1).
好像他们又说这是个小学生都知道的结论T^T
2.假如我想要知道[l,r]区间内所有的因子数,不能像单一的一样单个扫描2,3,5,7…而是要2,扫l~r所有2的倍数,3扫,5扫,这样就不会浪费时间在扫一些大素数上.
最后的最后,分解时要忘记本身是大素数的情况!!!!
1.要得知一个数有多少因子,假设他可以被分解为素因数
n = p1^c1*p2^c2+p3^c3…
那么他的因子数为(c1+1)(c2+1)+…+(ck+1).
好像他们又说这是个小学生都知道的结论T^T
2.假如我想要知道[l,r]区间内所有的因子数,不能像单一的一样单个扫描2,3,5,7…而是要2,扫l~r所有2的倍数,3扫,5扫,这样就不会浪费时间在扫一些大素数上.
最后的最后,分解时要忘记本身是大素数的情况!!!!
/* xzppp */ #include <iostream> #include <vector> #include <cstdio> #include <string.h> #include <algorithm> #include <queue> #include <map> #include <string> #include <cmath> #include <bitset> #include <iomanip> using namespace std; #define FFF freopen("in.txt","r",stdin);freopen("out.txt","w",stdout); #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define MP make_pair #define PB push_back #define _ %MOD typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int > pii; typedef pair<LL,LL> pll; typedef pair<double,double > pdd; typedef pair<double,int > pdi; const int MAXN = 1e6+17; const int MAXM = 1e6+17; const int MAXV = 2*1e3+17; const int BIT = 15+3; const int INF = 0x7fffffff; const LL INFF = 0x3f3f3f3f3f3f3f3f; const int MOD = 998244353; int prime[1100000],primesize=0; bool isprime[11000000]; void sieve(int listsize){ memset(isprime, 1, sizeof(isprime)); isprime[1] = false; for(int i=2;i<=listsize;i++){ if(isprime[i]) prime[++primesize]=i; for(int j = 1; j <= primesize && i*prime[j] <= listsize;j++){ isprime[i*prime[j]] = false; if(i%prime[j] == 0) break; } } } LL sum[MAXN],rem[MAXN]; int main() { #ifndef ONLINE_JUDGE FFF #endif sieve(1000000); int t; cin>>t; while(t--) { LL l,r,k,ans = 0; scanf("%lld%lld%lld",&l,&r,&k); for (int i = 0; i < r-l+1; ++i) { sum[i] = 1; rem[i] = i+l; } for (int i = 1; i <= primesize; ++i) { LL p = prime[i]; if(p>r) break; LL beg = l/p *p ; for (LL j = beg; j <= r; j+=p) { if(j<l) continue; LL cnt = 0; while(rem[j-l]%p==0) { cnt++; rem[j-l]/=p; } sum[j-l] = (sum[j-l] * (k*cnt+1)_)_; } } for (int i = 0; i < r-l+1; ++i) { if(rem[i]!=1) sum[i] = (sum[i]*(k+1)_)_; ans = (ans + sum[i])_; } printf("%lld\n",ans ); } return 0; }
相关文章推荐
- HDU 6069 数学题,区间素数筛
- [hdu 6069]素数筛+区间质因数分解
- HDU 6069 数论 区间素数筛(+赛后反思
- Hdu 6069 Counting Divisors【素数区间筛+预处理素因子分解】
- hdu 6069 素数
- hdu 6069 Counting divisors 公式+区间筛
- HDU 6069 Counting Divisors (素数)
- hdu 6069 素数
- HDU 5327 区间里由不同的数字组成的数的个数-set-(枚举)
- hdu 4354 Missile(中心区间枚举+树形DP判断,5级)
- hdu 6069 区间筛
- hdu 6069 素数
- HDU 5400 Arithmetic Sequence(左d1等差右d2等差的区间个数)(枚举位置,求最大区间,算区间个数)
- HDU 5778 abs 枚举 素数相关
- hdu 4354 Missile(中心区间枚举+树形DP判断,5级)
- hdu 6069 素数
- HDU 6069 Counting Divisors(区间素数筛法)
- hdu 2058 枚举区间和个数
- HDU 6069 素数筛+分解质因子
- Help Hanzo (素数筛+区间枚举)