http://acm.hdu.edu.cn/showproblem.php?pid=6069
求一段区间里面所有数的因子个数和,很直白的去暴力必定超时,
因为任何数都可以被分解为若干个质数相乘的形式,那么意味着可以将所有的质数找到,然后去不断的给一个范围里的数去这个质数来筛.
以后碰到计算因子个数的题目,感觉可以借鉴这道题的方法.
#include<bits/stdc++.h> using namespace std; const long long int MOD=998244353; long long int pr[1111111]; bool vis[1111111]; long long int num[1111111]; long long int sum[1111111]; long long int _js=0; void _loading(){ _js=0; memset(vis,true,sizeof(vis)); vis[0]=0; vis[1]=0; for(int i=0;i<=1000005;i++) { if(vis[i]==0)continue; vis[i]=0; pr[_js++]=i; for(int j=i*2;j<=1000005;j=j+i) vis[j]=0; } } int main(){ long long int l,r,k; long long int t; _loading(); scanf("%lld",&t); while(t--) { scanf("%lld%lld%lld",&l,&r,&k); long long int i,j; for(i=0;i<=r-l;i++) { num[i]=i+l; sum[i]=1; } for(i=0;i<_js;i++) { long long int i1=(l/pr[i]+(l%pr[i]? 1:0 ))*pr[i]; for(j=i1;j<=r;j=j+pr[i]) { long long int _js1=0; while(num[j-l]%pr[i]==0) { _js1++; num[j-l]/=pr[i]; } sum[j-l]=sum[j-l]*(1LL*_js1*k+1)%MOD; } } long long int ans=0; for(i=0;i<=r-l;i++) { if(num[i]!=1)sum[i]=sum[i]*(k+1)%MOD; ans=(ans+sum[i])%MOD; } cout<<ans<<endl; } return 0; }