hdu 6069 区间筛

题意:。。一个公式

思路:和区间筛类似POJ 2689。。。筛出L,R的每个质因数的个数即可,然后简单的组合公式,就可以算出i的k次方的约数个数

PS。。vector乱搞会卡常。。

代码:

#include<bits/stdc++.h>
using namespace std;
#define MEM(a,b) memset(a,b,sizeof(a))
#define PB push_back
#define MP make_pair
#define X first
#define Y second
#define bug puts("bug");
typedef long long ll;
const int maxn=1e6+10;
const int MAXN=1000010;
const int mo=998244353;
ll prime[MAXN+1];
void getPrime(){
    memset(prime,0,sizeof(prime));
    for(int i=2; i<=MAXN; i++){
        if(!prime[i])prime[++prime[0]]=i;
        for(int j=1; j<=prime[0]&&prime[j]<=MAXN/i; j++){
            prime[prime[j]*i]=1;
            if(i%prime[j]==0) break;
        }
    }
}
ll t,l,r,k;
ll X[maxn],A[maxn];

int main(){
    getPrime();
    scanf("%d",&t);
    while(t--){
        scanf("%lld%lld%lld",&l,&r,&k);
        for(ll i=l;i<=r;i++) X[i-l]=i,A[i-l]=1;
        ll ans=0,ret,be,p;
        for(ll i=1;prime[i]*prime[i]<=r&&i<prime[0];++i){
            be=l-l%prime[i],p=prime[i];
            if(be<l) be+=p;
            for(ll j=be;j<=r;j+=p){
                ret=1;
                while(X[j-l]%p==0){
                    ret=(ret+k)%mo;
                    X[j-l]/=p;
                }
                A[j-l]=(A[j-l]*ret)%mo;
            }
        }
        for(ll i=l;i<=r;i++) if(X[i-l]!=1) A[i-l]=(A[i-l]*(k+1))%mo;
        for(ll i=l;i<=r;i++)ans=(A[i-l]+ans)%mo;
        printf("%lld
",ans);
    }
    return 0;
}



原文地址:https://www.cnblogs.com/zhangxianlong/p/10672508.html