hdu6069[素数筛法] 2017多校3

/*hdu6069[素数筛法] 2017多校3*/
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL l, r, k;
const LL MOD = 998244353LL;
int T, n, prime[1100000], primesize;
bool isprime[11000000];
void getlist(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 num[1000005], ans[1000005];
void solve() {
    LL n = r - l + 1;
    for (int i = 0; i < n; i++) {
        num[i] = i + l;
        ans[i] = 1;
    }
    for (int i = 1; (LL)prime[i]*prime[i] <= r; i++) {
        for (LL j = prime[i] * (l / prime[i]); j <= r; j += prime[i]) {
            if (j < l) continue;
            LL cnt = 0;
            while (num[j - l] % prime[i] == 0) {
                cnt++;
                num[j - l] /= prime[i];
            }
            ans[j - l] = (ans[j - l] * (1LL + cnt * k)) % MOD;
        }
    }
    LL res = 0;
    for (int i = 0; i < n; i++) {
        if (num[i] > 1) {
            ans[i] = (ans[i] * (1LL + k)) % MOD;
        }
        res = (res + ans[i]) % MOD;
    }
    printf("%lld\n", res);
}
int main() {
    getlist(1000005);
    scanf("%d", &T);
    while (T--) {
        scanf("%lld%lld%lld", &l, &r, &k);
        solve();
    }
    return 0;
}
时间: 2024-10-27 00:35:27

hdu6069[素数筛法] 2017多校3的相关文章

hdu6098[RMQ+筛法] 2017多校6

/*hdu6098[RMQ+筛法] 2017多校6*/ #include <bits/stdc++.h> using namespace std; int T, n, st[100005][20], len[100005], a[100005]; void st_init() { len[0] = -1; for (int i = 1; i <= n; i++) { st[i][0] = a[i]; len[i] = (i & (i - 1)) == 0 ? len[i - 1]

HDOJ 6069 素数筛法(数学)

Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 3041    Accepted Submission(s): 1130 Problem Description In mathematics, the function d(n) denotes the number of divisors of

POJ_3421_X-factor Chains(素数筛法)

X-factor Chains Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5659   Accepted: 1786 Description Given a positive integer X, an X-factor chain of length m is a sequence of integers, 1 = X0, X1, X2, -, Xm = X satisfying Xi < Xi+1 and Xi

hdu6035[dfs+思维] 2017多校1

/*hdu6035[dfs+思维] 2017多校1*/ //合并色块, 妙啊妙啊 #include<bits/stdc++.h> using namespace std; const double eps=1e-8; const int inf=0x3f3f3f3f; typedef long long LL; vector<int>G[200005]; LL sum[200005]; int c[200005],son[200005],mark[200005]; int n,u,

hdu6034[模拟] 2017多校1

/*hdu6034[模拟] 2017多校1*/ //暴力模拟26个26进制数即可, 要注意进位 #include<bits/stdc++.h> using namespace std; typedef long long LL; const double eps=1e-8; const int inf=0x3f3f3f3f; struct node{ char num[100005]; int ch,high; }bits[30]; const int mod=1000000007; int

HDU 6069 Counting Divisors(区间素数筛法)

题意:...就题面一句话 思路:比赛一看公式,就想到要用到约数个数定理 约数个数定理就是: 对于一个大于1正整数n可以分解质因数: 则n的正约数的个数就是 对于n^k其实就是每个因子的个数乘了一个K 然后现在就变成了求每个数的每个质因子有多少个,但是比赛的时候只想到sqrt(n)的分解方法,总复杂度爆炸,就一直没过去,然后赛后看官方题解感觉好妙啊! 通过类似素数筛法的方式,把L - R的质因子给分解,就可以在O(nlogn)的时间之内把所以的数给筛出来. 代码: /** @xigua */ #i

poj 2478 Farey Sequence(基于素数筛法求欧拉函数)

http://poj.org/problem?id=2478 求欧拉函数的模板. 初涉欧拉函数,先学一学它基本的性质. 1.欧拉函数是求小于n且和n互质(包括1)的正整数的个数.记为φ(n). 2.欧拉定理:若a与n互质,那么有a^φ(n) ≡ 1(mod n),经常用于求幂的模. 3.若p是一个质数,那么φ(p) = p-1,注意φ(1) = 1. 4.欧拉函数是积性函数: 若m与n互质,那么φ(nm) = φ(n) * φ(m). 若n = p^k且p为质数,那么φ(n) = p^k - p

NowCoder猜想(素数筛法+位压缩)

在期末被各科的大作业碾压快要窒息之际,百忙之中抽空上牛客网逛了逛,无意中发现一道好题,NowCoder猜想,题意很明显,就是个简单的素数筛法,但竟然超内存了,我晕(+﹏+)~  明明有 3 万多 k 的空间限制……于是我不打表,试了试最暴力的做法,赤裸裸的做法果然超时了,无奈,只好对素数筛法进行位压缩了,这是我目前所能想到的方法了,第一次用上这样的特技,还是调了好一会(位数组里不能用 bool 来定义,具体的话好像 bool 和 int 之类的整型稍有不同:也不能用 int,因其最高位是正负标志

【POJ3006】Dirichlet&#39;s Theorem on Arithmetic Progressions(素数筛法)

简单的暴力筛法就可. 1 #include <iostream> 2 #include <cstring> 3 #include <cmath> 4 #include <cctype> 5 #include <cstdio> 6 #include <cmath> 7 #include <algorithm> 8 #include <numeric> 9 using namespace std; 10 11 co