Hdu 6069
来源:互联网 发布:粒子群算法的具体应用 编辑:程序博客网 时间:2024/05/26 20:23
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=6069
题目大意:
给定区间
分析:
区间长度为1e6,数据有10组以上,暴力分解整个区间的话,每个数的分解至多是logn级别的,而基于Miller_Robin的质因数分解polard_rho也只是
代码:
#include <bits/stdc++.h>using namespace std;typedef long long ll;const ll mod = 998244353;const int maxn = 1e6+100;ll l,r,k;int len;bool isprime[maxn+200];int prime[maxn];ll divi[maxn];ll cnt[maxn];void init(){ for (int i =2 ; i <= maxn; i ++) { if (!isprime[i]) { prime[++prime[0]] = i; for (int j = i +i ; j <= maxn ; j+= i) isprime[j] = true; } }}void solve(){ int st; for (int i = 1 ; prime[i]<= r/prime[i] && i<= prime[0] ; i ++) { //printf("i = %d\n",prime[i]); if (l%prime[i]==0) st = 1; else st = 1 + (prime[i]-l%prime[i]); for (int j = st ; j <= len ; j +=prime[i]) { int ct = 0; while (divi[j]%prime[i]==0) { divi[j]/=prime[i]; ct++; } cnt[j]*=(ct*k+1); if (cnt[j]>=mod) cnt[j] %= mod; } } ll ans = 0; for (int i =1 ; i <= len ; i ++) { if (divi[i]!=1) cnt[i] = cnt[i] * (k+1)%mod; //printf("divi[%d] = %lld\n",i,divi[i]); ans += cnt[i]; if (ans>=mod) ans %= mod; } printf("%lld\n",ans);}int main(){ init(); //printf("prime[0] = %d\n",prime[0]); int T; scanf("%d",&T); while (T--) { scanf("%lld%lld%lld",&l,&r,&k); len = (int)(r- l +1); for (int i = 1 ; i <= len ; i ++) { divi[i] = l + i -1; cnt[i] = 1; } solve(); } return 0;}
阅读全文
0 0
- Hdu 6069
- Hdu 6069
- HDU 6069
- hdu 6069 Counting Divisors
- [HDU]6069 Counting Divisors
- hdu 6069 区间筛
- hdu 6069 类筛法
- hdu 6069 区间筛
- hdu 6069 素数
- HDU 6069 Counting Divisors
- HDU 6069 Counting Divisors
- HDU-6069 Counting Divisors
- HDU 6069 Counting Divisors
- HDU-6069 Counting Divisors
- HDU 6069 Counting Divisors
- HDU 6069 Counting Divisors
- hdu 6069 Counting Divisors
- HDU 6069 Counting Divisors
- Stanford CoreNLP学习日记2
- “SIM卡状态”中的dBm和状态栏的信号格数是对应的吗?
- Java线程:锁
- lnmp环境的使用
- Java线程:堵塞队列与堵塞栈
- Hdu 6069
- pick定理
- JNI 总结
- Java线程:条件变量、原子量、线程池等
- 事务的四种隔离级别和七种传播机制
- 栈->一般算术表达式转换成后缀式
- Java线程:线程安全类和Callable与Future(有返回值的线程)
- HDU-6069 Counting Divisors
- Java线程:线程交互