【2017 Multi-University Training Contest - Team 4】Counting Divisors
【Link】:http://acm.hdu.edu.cn/showproblem.php?pid=6069
【Description】
定义d(i)为数字i的因子个数;
求∑rld(ik)
其中l,r<=1012且r−l<=106
【Solution】
如果把一个数x质因数分解成p1a1∗p2a2∗...∗pnan
的形式;
可知数字x的因子个数为
(a1+1)∗(a2+1)∗...∗(an+1)
因为i还有k次方;
所以答案就是
(a1∗k+1)∗(a2∗k+1)∗...∗(an∗k+1)
需要对l..r里面所有的数字都进行质因数分解;
可以这样
先处理出2..r√之间的所有素数;
然后枚举每个素数i它在l..r之间的倍数x;
则对x 用素数i进行质因数分解,也即一直除它;
这样,就能算出来x在质因数分解的时候,素数i最后的指数是多少了;
(累乘数字x的答案就好);
记录x在进行质因数分解的时候被除剩下的数字,除的时候是用
这个记录的数字除;
最后这个数字可能会不变;
因为它本身可能就是一个素数;
所以小于r√的素数可能不是它的因子;
但是不可能还有大于r√的因子;
所以如果除剩下的数字还大于0;
答案再乘上(k+1)就好;
最后把每个数字它的答案累加起来;
(一开始可以用O(n)的素数筛求出1..n之间的所有素数);
【NumberOf WA】
many times
【Reviw】
一开始一直往O(n14)的质因数分解想了;
没想到这种方法.
判断出某个素数是某个数的因子之后,不要再记录它的因子是什么了;
直接就开始质因数分解,这样比较快;
不然会超时.
【Code】
#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
#define ri(x) scanf("%d",&x)
#define rl(x) scanf("%lld",&x)
#define rs(x) scanf("%s",x+1)
#define oi(x) printf("%d",x)
#define ol(x) printf("%lld",x)
#define Open() freopen("F:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0)
typedef pair<int,int> pii;
typedef pair<LL,LL> pll;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 1e6;
const LL MOD = 998244353;
bool iszs[N+100];
vector <int> zsb;
LL num[N+100],ans[N+100];
int main(){
//Open();
//Close();
ms(iszs,true);
rep1(i,2,N)
{
if (iszs[i]) zsb.pb(i);
int len = zsb.size();
rep1(j,0,len-1)
{
int t = zsb[j];
if (i*t>N) break;
iszs[i*t] = false;
if (i%t==0) break;
}
}
int T;
ri(T);
while (T--){
LL l,r,k;
rl(l),rl(r),rl(k);
for (LL i = l;i <= r;i++)
num[i-l+1] = i,ans[i-l+1] = 1;
rep1(i,0,(int) zsb.size()-1){
LL x = zsb[i];
if (x > r) break;
LL temp = ((l-1)/x + 1)*x;
for (LL i = temp;i <= r;i+=x){
LL tot = i,cnt = 0;
while (tot%x==0){
tot/=x;
num[i-l+1]/=x;
cnt++;
}
ans[i-l+1] = ans[i-l+1]*(cnt*k+1)%MOD;
}
}
LL fans = 0;
for (LL i = l;i <= r;i++){
if (num[i-l+1]!=1){
fans = (fans + ans[i-l+1]*(k+1)%MOD)%MOD;
}else
fans = (fans + ans[i-l+1])%MOD;
}
ol(fans);puts("");
}
return 0;
}
【2017 Multi-University Training Contest - Team 4】Counting Divisors的更多相关文章
- 2017 Multi-University Training Contest - Team 4 hdu6069 Counting Divisors
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6069 题目: Counting Divisors Time Limit: 10000/5000 ...
- 2017 Multi-University Training Contest - Team 4——HDU6069&&Counting Divisors
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6069 题目意思:首先解释一下d[n]这个函数表示n有多少个因子,百度一下可以知道这个函数是一个非完全积 ...
- 【2017 Multi-University Training Contest - Team 2】TrickGCD
[Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6053 [Description] 给你一个b数组,让你求一个a数组: 要求,该数组的每一位都小于等 ...
- 【2017 Multi-University Training Contest - Team 2】Maximum Sequence
[Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6047 [Description] 给你一个数列a和一个数列b; 只告诉你a的前n项各是什么; 然后 ...
- 【2017 Multi-University Training Contest - Team 2】 Regular polygon
[Link]: [Description] 给你n个点整数点; 问你这n个点,能够组成多少个正多边形 [Solution] 整点只能构成正四边形. 则先把所有的边预处理出来; 枚举每某两条边为对角线的 ...
- 【2017 Multi-University Training Contest - Team 2】 Is Derek lying?
[Link]: [Description] 两个人都做了完全一样的n道选择题,每道题都只有'A','B','C' 三个选项,,每道题答对的话得1分,答错不得分也不扣分,告诉你两个人全部n道题各自选的是 ...
- 【2017 Multi-University Training Contest - Team 5】Rikka with Competition
[Link]: [Description] [Solution] 把所有人的能力从大到小排; 能力最大的肯定可能拿冠军; 然后一个一个地往后扫描; 一旦出现a[i-1]-a[i]>k; 则说明从 ...
- 【2017 Multi-University Training Contest - Team 5】Rikka with Subset
[Link]: [Description] 给你a数组的n个数的所有2^n个子集的2^n个子集元素的和; 子集元素的和最大为m; 告诉你各个子集元素的和出现的次数; 如 1 2 则0出现1次,1出现1 ...
- 【2017 Multi-University Training Contest - Team 5】Rikka with Graph
[Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6090 [Description] 给你n个点; 让你在这n个点上最多连m条无向边; 使得 ∑ni= ...
随机推荐
- 通俗易懂的Git使用入门教程
原文链接:点我 首先新司机接触 Git 和 Github 可能会搞不清楚两者之间的关系,这里稍微解释一下: 1.Git是一款免费.开源的分布式版本控制系统 2.Github是用Git做版本控制的代码托 ...
- js中return 、return false 、return true、break、continue区别
在开发中不熟悉这三者区别的同学,一般都知道return可以中止,但会根据字面意思觉得return true 中止当前函数执行,但其后的函数还会继续执行.return false 中止当前函数执行,其后 ...
- java uploadify 上传组件使用方法
!!!声明 1-3 是jsp页面所写内容 文中需要的util 参见百度云 http://pan.baidu.com/s/1kV0gqBt 如已失效 请加QQ1940978083 1.首先引入 ...
- vi-vim和linux常用快捷键
移动光标 上 k 下 j 左 h 右 l 移动光标到当前行行尾首 ^ 移动光标到当前行行尾 $ 移动到文件的第一行 gg 移动到文件的最后一行 G 移动到第1 ...
- win下通过pip安装TensorFlow
官方介绍(超详细):https://www.tensorflow.org/install/pip 按照官方介绍,不同的TensorFlow版本只支持特定的python版本所以你要是下载.whl包安装的 ...
- Git 如何把master的内容更新到分支
Background: 当有人对master进行更新之后,你想让已经创建的分支内容更新到master的最新状态, bpan@5CG7022BM2 MINGW64 /d/GitRep/JIRA_Exte ...
- 钩子(hooks)—webhook-使用钩子自动触发部署
钩子(hooks)-webhook http://fighter.blog.51cto.com/1318618/1670667 https://www.lovelucy.info/auto-deplo ...
- gcc 生成动态链接库
http://blog.csdn.net/ngvjai/article/details/8520840 Linux下文件的类型是不依赖于其后缀名的,但一般来讲: .o,是目标文件,相当于windows ...
- java关闭资源,自制关闭资源工具类
在网上看到一篇关于关闭资源的正确方式:http://blog.csdn.net/bornforit/article/details/6896775 该博文中的总结: (1)使用finally块来关闭物 ...
- 在启动php时,无法启动此程序,由于计算机中丢失MSVCR110.dll的解决方法
在启动php时,运行RunHiddenconsole.exe php-cgi.exe -b 127.0.0.1:9000 -c时,出现错误:无法启动此程序,由于计算机中丢失MSVCR110.dll 方 ...