HDU 6069 Counting Divisors
【题目链接】http://acm.hdu.edu.cn/showproblem.php?pid=6069
题目意思
给你了l,r,k。问你i从l到r,i^k因子个数的总和
解题思路
根据约数个数定理:n=p1^a1×p2^a2×p3^a3*…*pk^ak
,n的约数的个数就是(a1+1)(a2+1)(a3+1)…(ak+1)
.(p为质数)
若i=p1^a1×p2^a2×p3^a3*…*pk^ak,则i^K=p1^(a1*K)×p2^(a2*K)×p3^(a3*K)*…*pk^(ak*K)
,i^K的约数的个数就是(a1*K+1)(a2*K+1)(a3*K+1)…(ak*K+1)
,由此可推出质数的因子数为k+1
。质数的a次方就有(a*k)+1
个因子
这样只要把区间里的合数分为质数乘积就可以了。(如:12=2*2*3
,他的因子数就为(2*1+1)*(1+1)=6
代码部分
///发现写的是没大佬的好把大佬的代码借用了
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn=1e6+10;
const int mod=998244353;
int tot,t;
ll l,r,k,ans,cnt[maxn],q[maxn],pri[maxn];
bool vis[maxn];
void init() ///筛选法质数打表
{for(int i=2; i<maxn; i++){if(!vis[i])pri[tot++]=i;for(int j=0; j<tot; j++){int k=i*pri[j];if(k>maxn)break;vis[k]=1;}}
}
int main()
{scanf("%d",&t);init();while(t--){scanf("%lld%lld%lld",&l,&r,&k);ans=0;if(l==1) ans++,l++;for (ll i=0; i<=r-l; i++){cnt[i]=1; ///存对应的l+i里有多少个质数q[i]=l+i; ///存下标}for (ll i=0; pri[i]*pri[i]<=r; i++) {ll j=l/pri[i]+(l%pri[i]!=0); ///找到这个质数第一个出现的给定区间的倍数for (j=j*pri[i]; j<=r; j+=pri[i]) ///从区间里第一个质数倍数到最后一个{ll tmp=0; while (q[j-l]%pri[i]==0){q[j-l]/=pri[i]; ///求可以分解多少个pre[i], tmp++;}cnt[j-l]*=(tmp*k)%mod+1; ///tmp个pir[i]所以cnt[j-1]有(tmp*k)%mod+1个质数cnt[j-l]%=mod; }}for (ll i=0; i<=r-l; i++){if (q[i]!=1) ///可能残留大于根号r的一个质数ans+=((k+1)*cnt[i])%mod;else ans+=cnt[i];ans%=mod;}printf("%lld\n",ans);}
}
HDU 6069 Counting Divisors相关推荐
- SPOJ 20713 DIVCNT2 - Counting Divisors (square)
DIVCNT2 - Counting Divisors (square) #sub-linear #dirichlet-generating-function Let \sigma_0(n)σ0 ...
- Counting Divisors HDU - 6069
设n=p_1^{c_1}p_2^{c_2}...p_m^{c_m}n=p1c1p2c2...pmcm,则d(n^k)=(kc_1+1)(kc_2+1)...( ...
- HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)
版权声明:欢迎关注我的博客.本文为博主[炒饭君]原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/25471349 P ...
- hdu 3887 Counting Offspring
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3887 题意:给出一棵树,对于每一个节点,问他的子孙节点中有多少个节点小于该节点. 思路:首先找出这棵树 ...
- HDU 3240 Counting Binary Trees 数论-卡特兰数
题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=3240 卡特兰数递推公式h(i)=h(i-1)*(4*i-2)/(i+1) 如果直接算每一步,然后mo ...
- HDU 2431 Counting Problem
题意: 问 n * n 的格子里面放 2*n个皇后的放法数,满足每行每列的皇后数都是2. 分析: 解法可以由前面的递推到后面,知道 2 * 2 的图有一种情况后,可知大于 2 * 2 的图都可以预留 ...
- [Spoj]Counting Divisors (cube)
来自FallDream的博客,未经允许,请勿转载,谢谢. 设d(x)表示x的约数个数,求$\sum_{i=1}^{n}d(i^{3})$ There are 5 Input files. - Inpu ...
- HDU - 6184 Counting Stars(思维+三元环)
题目链接:点击查看 题目大意:给出一个 nnn 个点 mmm 条边组成的无向图,问图中有多少个"三元环对","三元环对"指的是两个三元环共用了一条边 题目分析: ...
- 【线性筛】【质因数分解】【约数个数定理】hdu6069 Counting Divisors
d(x)表示x的约数个数,让你求(l,r<=10^12,r-l<=10^6,k<=10^7) #include<cstdio> using namespace std; ...
- 【SP26073】DIVCNT1 - Counting Divisors 题解
题目描述 定义 \(d(n)\) 为 \(n\) 的正因数的个数,比如 \(d(2) = 2, d(6) = 4\). 令 $ S_1(n) = \sum_{i=1}^n d(i) $ 给定 \(n\ ...
最新文章
- LeetCode实战:两数之和
- Python使用numpy函数vsplit垂直(行角度)拆分numpy数组(返回拆分后的numpy数组列表)实战:垂直拆分二维numpy数组、split函数垂直拆分二维numpy数组
- SpringBoot系列: Web应用鉴权思路
- idea编译项目 失败_在IntelliJ IDEA下使用Lombok时无法编译项目
- Activity查看数据与文本框反回数据
- itchat爬取朋友圈签名制作词云
- fprintf,sprintf,sscanf,fscanf
- Windows平台下 找回已丢失的MySql root 用户密码
- OpenCV_09 模版匹配和霍夫变换:霍夫线检测+霍夫圆检测
- 【李宏毅机器学习】regress case study 回归案例研究(p3) 学习笔记
- 【转】Windows的多线程编程,C/C++
- angular同源策略禁止读取_Redis5.0数据淘汰策略详解(最新版本,面试常问)
- java.lang.NoClassDefFoundError: com/baidu/ueditor/ActionEnter报错解决
- C++:以空格分隔的字符串的输入输出
- 动态规划和分治法解合唱队形问题
- 第三十三篇 transition-group 列表过渡
- 传统6大茶类都有哪些
- Tesseract(识别验证码)
- java优先队列 PriorityQueue详解(附图)
- imp oracle错误3114,imp时发生错误ORA-01114