对于[l , r]内的每个数,根据唯一分解定理有  

所以有 

因为    

//可根据唯一分解定理推导

所以     

题目要求

就可以运用它到上述公式

(注意不能暴力对l,r内的数一个个分解算贡献,而应该枚举l,r区间内质数的倍数):

/*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[], primesize;
bool isprime[];
void getlist(int listsize)
{
memset(isprime, , sizeof(isprime));
isprime[] = false;
for (int i = ; i <= listsize; i++)
{
if (isprime[i])prime[++primesize] = i;
for (int j = ; j <= primesize && i * prime[j] <= listsize; j++)
{
isprime[i * prime[j]] = false;
if (i % prime[j] == )break;
}
}
}
LL num[], ans[];
void solve() {
LL n = r - l + ;
for (int i = ; i < n; i++) {
num[i] = i + l;
ans[i] = ; //预处理l到r之间所有的数 和 其对答案的的贡献;
}
//不能枚举l到r之间的元素进行暴力质因数分解, 会超时; 所以我们可以通过枚举质数的倍数来优化。
for (int i = ; (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 = ; //对l到r之间素数prime[i]的倍数进行质因数分解, 计算出其对答案的贡献;
while (num[j - l] % prime[i] == ) {
cnt++;
num[j - l] /= prime[i];
}
ans[j - l] = (ans[j - l] * (1LL + cnt * k)) % MOD;
}
}
LL res = ;
for (int i = ; i < n; i++) {
if (num[i] > ) {
ans[i] = (ans[i] * (1LL + k)) % MOD;
}
res = (res + ans[i]) % MOD;
}
printf("%lld\n", res);
}
int main() {
getlist();
scanf("%d", &T);
while (T--) {
scanf("%lld%lld%lld", &l, &r, &k);
solve();
}
return ;
}

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

  1. hdu6098[RMQ+筛法] 2017多校6

    /*hdu6098[RMQ+筛法] 2017多校6*/ #include <bits/stdc++.h> using namespace std; ][], len[], a[]; voi ...

  2. hdu6069(简单数学+区间素数筛法)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6069 题意: 给出 l, r, k.求:(lambda d(i^k))mod998244353,其中 ...

  3. 2017 多校2 hdu 6053 TrickGCD

    2017 多校2 hdu 6053 TrickGCD 题目: You are given an array \(A\) , and Zhu wants to know there are how ma ...

  4. HDOJ 6069 素数筛法(数学)

    Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Oth ...

  5. 2017 多校3 hdu 6061 RXD and functions

    2017 多校3 hdu 6061 RXD and functions(FFT) 题意: 给一个函数\(f(x)=\sum_{i=0}^{n}c_i \cdot x^{i}\) 求\(g(x) = f ...

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

    在期末被各科的大作业碾压快要窒息之际,百忙之中抽空上牛客网逛了逛,无意中发现一道好题,NowCoder猜想,题意很明显,就是个简单的素数筛法,但竟然超内存了,我晕(+﹏+)~  明明有 3 万多 k ...

  7. [原]素数筛法【Sieve Of Eratosthenes + Sieve Of Euler】

    拖了有段时间,今天来总结下两个常用的素数筛法: 1.sieve of Eratosthenes[埃氏筛法] 这是最简单朴素的素数筛法了,根据wikipedia,时间复杂度为 ,空间复杂度为O(n). ...

  8. 数学#素数筛法 HDU 4548&POJ 2689

    找素数本来是很简单的问题,但当数据变大时,用朴素思想来找素数想必是会超时的,所以用素数筛法. 素数筛法 打表伪代码(用prime数组保存区间内的所有素数): void isPrime() vis[]数 ...

  9. POJ 3292 Semi-prime H-numbers (素数筛法变形)

    题意:题目比较容易混淆,要搞清楚一点,这里面所有的定义都是在4×k+1(k>=0)这个封闭的集合而言的,不要跟我们常用的自然数集混淆. 题目要求我们计算 H-semi-primes, H-sem ...

随机推荐

  1. postgresql 存储过程动态更新数据

    -- 目标:动态更新表中数据 -- 老规矩上代码-----------------------------tablename 表名--feildname 字段名数组--feildvalue 字段值数组 ...

  2. Android仿ios底部弹出框效果

    准备: public class ActionSheet { public interface OnActionSheetSelected { void onClick(int whichButton ...

  3. PE基础2

    PE课程002 怎么找到Nt头? (PIMAGE_NT_HEADER)(DOS.e_lfanew + (DWORD)m_pBuff) 怎么找到第一个区段表? 区段头位置 = pNt + 4 + 文件头的 ...

  4. 利用java自带的base64实现加密、解密

    package com.stone.util; import java.io.UnsupportedEncodingException; import sun.misc.*; public class ...

  5. Java常见对象Object类中的个别方法

    Java常见对象Object类 public int hashCode() : 返回该对象的哈希码值. 注意:哈希值是根据哈希算法计算出来的一个值,这个值和地址值有关,但是不是实际地址值.你可以理解成 ...

  6. House of Spirit(fastbin)

    0x01 fastbin fastbin所包含chunk的大小为16 Bytes, 24 Bytes, 32 Bytes, … , 80 Bytes.当分配一块较小的内存(mem<=64 Byt ...

  7. word2vec 中的数学原理详解(二)预备知识

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/peghoty/article/details/37969635 https://blog.csdn. ...

  8. UVa 291 The House Of Santa Claus——回溯dfs

    题意:从左下方的1开始,一笔画出圣诞老人的房子. #include <iostream> #include <cstring> using namespace std; ][] ...

  9. 【简●解】 LG P2730 【魔板 Magic Squares】

    LG P2730 [魔板 Magic Squares] [题目背景] 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 ...

  10. 牛客练习赛40 C-小A与欧拉路

    求图中最短的欧拉路.题解:因为是一棵树,因此当从某一个节点遍历其子树的时候,如果还没有遍历完整个树,一定还需要再回到这个节点再去遍历其它子树,因此除了从起点到终点之间的路,其它路都被走了两次,而我们要 ...