hdu 6069 Counting Divisors(约数个数)(2017 Multi-University Training Contest
来源:互联网 发布:文献法包括网络 编辑:程序博客网 时间:2024/05/22 16:40
Counting Divisors
题目链接:Counting Divisors
题意:d[i]表示i的约数有多少个,求
官方题解:
我来解释一下,
任意一个数n都可以表示成
那么
因此我们只需要遍历[l,r]区间内所有数,对每一个数的求出它每一个质因子的个数即可
又r<=1e12,
代码:
#include<bits/stdc++.h>using namespace std;typedef long long LL;const LL maxn=1e6+10;const LL mod=998244353;LL prime[maxn/10],num[maxn],sum[maxn];//sum[i]记录i+le的约数个数bool vis[maxn];LL k,tot,ri,le;void Table()//1e6以内的素数打表{ tot=0; for(LL i=2; i<maxn; ++i) { if(!vis[i]) prime[tot++]=i; for(LL j=0; j<tot&&i*prime[j]<maxn; ++j) { vis[i*prime[j]]=true; if(i%prime[j]==0) break; } }}LL solve(){ for(LL i=0; i<tot&&prime[i]*prime[i]<=ri; ++i) { LL tmp=le; if(tmp%prime[i])//将tmp变成>=le的第一个能整除prime[i]的数 tmp=(tmp/prime[i]+1)*prime[i]; for(LL j=tmp; j<=ri; j+=prime[i])//j都能整除prime[i] { LL cnt=0; while(num[j-le]%prime[i]==0) { ++cnt; num[j-le]/=prime[i]; } sum[j-le]=(sum[j-le]*(cnt*k+1)%mod)%mod; } } LL ans=0; for(LL i=0; i<=ri-le; ++i) { if(num[i]>1)//对于有大于sqrt(r)的素因子的情况进行判断 ans=(ans+sum[i]*(k+1)%mod)%mod; else ans=(ans+sum[i])%mod; } return ans;}int main(){ Table(); int t; scanf("%d",&t); while(t--) { scanf("%lld%lld%lld",&le,&ri,&k); for(LL i=0; i<=ri-le; ++i) num[i]=i+le,sum[i]=1; printf("%lld\n",solve()); } return 0;}
阅读全文
1 0
- hdu 6069 Counting Divisors(约数个数)(2017 Multi-University Training Contest
- HDU 6069 Counting Divisors(素数筛法+枚举+技巧)——2017 Multi-University Training Contest
- HDU 6069 Counting Divisors(素数筛法+枚举+技巧)——2017 Multi-University Training Contest
- hdu 6069 统计区间约数的个数 2017 Multi-University Training Contest
- 2017 Multi-University Training Contest 4 && HDOJ 6069 Counting Divisors 【区间筛法】
- HDU 6069 Counting Divisors (2017 Multi-Univ Training Contest 4)
- HDU 6069 Counting Divisors (约数个数定理)
- HDU 6069 Counting Divisors【约数个数定理】
- HDU 3068 2017 Multi-University Training Contest
- HDU 6034 & 2017 Multi-University Training Contest
- hdu 6034 2017 Multi-University Training Contest
- HDU 3065 2017 Multi-University Training Contest
- HDU 6047 2017 Multi-University Training Contest
- HDU 6052 2017 Multi-University Training Contest
- HDU 6058 2017 Multi-University Training Contest
- HDU 6078 2017 Multi-University Training Contest
- (hdu 6078)2017 Multi-University Training Contest
- HDU 6069 Counting Divisors【素数筛】【约数个数定理】
- 演练:viewpager的结合的欢迎页面和小点的距离设置计算
- 倒角距离匹配
- java选择排序的实现
- C语言-难以发现的小错误以及易忘心得(待续)
- JAVA导出Excel表
- hdu 6069 Counting Divisors(约数个数)(2017 Multi-University Training Contest
- erlang安装
- Label的作用是什么?是怎么用的?
- 百练1745:Divisibility题解
- 打造企业级云深度学习平台——小米云深度学习平台的架构设计与实现
- ios KVC内部机制探索
- Maven 项目转 jave web 错误:cannot facet ......
- 初学acmer--读《算法竞赛入门经典》笔记<四>(p36-41)
- scrollview组件