hdu6069 多校Counting Divisors
2017-08-05 20:07
183 查看
思路:对于n^k其实就是每个因子的个数乘了一个K。然后现在就变成了求每个数的每个质因子有多少个,但是比赛的时候只想到sqrt(n)的分解方法,总复杂度爆炸,就一直没过去,然后赛后看官方题解感觉好妙啊!通过类似素数筛法的方式,把L - R的质因子给分解,就可以在O(nlogn)的时间之内把所以的数给筛出来。
/* gyt Live up to every day */ #include<cstdio> #include<cmath> #include<iostream> #include<algorithm> #include<vector> #include<stack> #include<cstring> #include<queue> #include<set> #include<string> #include<map> #include <time.h> #define PI acos(-1) using namespace std; typedef long long ll; typedef double db; const int maxn = 1e6+10; const ll maxm = 1e7; const ll mod = 998244353; const int INF = 0x3f3f3f; const ll inf = 1e15 + 5; const db eps = 1e-9; int is[maxn], pri[maxn]; ll f[maxn], num[maxn]; int cnt; ll r, l, k; void prim() { cnt=0; memset(is, 0, sizeof(is)); memset(pri, 0, sizeof(pri)); for (int i=2; i<maxn; i++) { if (!is[i]) { pri[++cnt]=i; for (int j=i+i; j<maxn; j+=i) { is[j]=1; } } } } void solve() { scanf("%lld%lld%lld", &l, &r, &k); for (ll i=l; i<=r; i++) { f[i-l+1]=1, num[i-l+1]=i; } for (int i=1; i<=cnt; i++) { ll be=l+pri[i]-l%pri[i]; if (l%pri[i]==0) be=l; for (ll j=be; j<=r; j+=pri[i]) { ll sum=0; while (num[j-l+1]%pri[i]==0) { sum++; num[j-l+1]/=pri[i]; } f[j-l+1]=f[j-l+1]*(k*sum%mod+1)%mod; } } ll ans=0; for (ll i=l; i<=r; i++) { if (num[i-l+1]!=1) f[i-l+1]=f[i-l+1]*(k+1)%mod; ans=(ans+f[i-l+1])%mod; } cout<<ans<<endl; } int main() { int t = 1; //freopen("in.txt", "r", stdin); scanf("%d", &t); prim(); while(t--) solve(); return 0; }
解释:
for (ll i=l; i<=r; i++) { f[i-l+1]=1, num[i-l+1]=i; }
如果不进行这一步,那么数是1~1^12存不下,但是我们已知r-l<=1e6,这样就可以存下了。
f[i]表示当前的因数个数,num[i],从l到r(下标1-(r-l+1))的数。
for (ll i=l; i<=r; i++) { if (num[i-l+1]!=1) f[i-l+1]=f[i-l+1]*(k+1)%mod; ans=(ans+f[i-l+1])%mod; }
判断当前这个数还有没有素数因子。
相关文章推荐
- 多校4 HDU6069 - Counting Divisors 素数、分解质因数
- HDU6069---Counting Divisors(2017多校联赛:数学)
- 多校_WHU_Bomb hdoj 3555
- 多校BIT 1001Inverting Cups (模线性方程的应用或找规律)
- 多校有感……
- 杭电 3836 多校联合赛 强连通分量
- 多校联合第二场(TJU)
- hdu 4324 Triangle LOVE 拓扑排序 多校联合赛(三)第四题
- hdu4334----多校联合4 hash
- hdu 4343 Interval query 【多校5】【数据结构】
- 2012多校可做题
- hdu4389-X mod f(x)-多校9-1010题解
- 多校联合第4场: ZZ的计算器
- 2013 多校第一场 hdu 4607 Park Visit
- hdu 4608 I-number 多校第一场
- HDU 4611 Balls Rearrangement(2013多校2 1001题)
- HDU 4618 Palindrome Sub-Array (2013多校2 1008 暴力)
- 2013 多校第二场 hdu 4617 Weapon
- HDU4612(Warm up)2013多校2-图的边双连通问题(Tarjan算法+树形DP)
- 2013暑期多校联合训练\第三场\Problem G