博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 6069 Counting Divisors —— 2017 Multi-University Training 4
阅读量:6491 次
发布时间:2019-06-24

本文共 2273 字,大约阅读时间需要 7 分钟。

Counting Divisors

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)

Total Submission(s): 2599    Accepted Submission(s): 959

Problem Description
In mathematics, the function 
d(n) denotes the number of divisors of positive integer n.
For example, d(12)=6 because 1,2,3,4,6,12 are all 12's divisors.
In this problem, given l,r and k, your task is to calculate the following thing :
 
Input
The first line of the input contains an integer 
T(1T15), denoting the number of test cases.
In each test case, there are 3 integers l,r,k(1lr1012,rl106,1k107).
 
Output
For each test case, print a single line containing an integer, denoting the answer.
 
Sample Input
3
1 5 1
1 10 2
1 100 3
 
Sample Output
10
48
2302
 
题目大意:d(i)是 i 的因数个数,让我们求 l<=i<=r 时,d(i^k)之和.
思路:对一个数n=p1t1*p2t2*...*pntn, pi是n的质因数。则n的因数个数是(t1+1)*(t2+1)*...*(tn-1+1)*(tn+1), 易得i^k的因数个数是(k*t1+1)*(k*t2+1)*...*(k*tn+1),
那么接下来就是要对 i 进行质因数分解了。 在打表打出质因数后,分解时对于一个质数P, 在[l , r]区间内所有能整除P的数进行质因数分解,这样能保证不会有多余时间花在搜索质因数上,这种做法类似筛法。具体见代码。
 
AC代码(标程):
1 #include
2 #include
3 #include
4 #include
5 #include
6 #define it (p-l) 7 using namespace std; 8 typedef long long LL; 9 const LL MOD=998244353;10 const long long MAXN=1000005;11 long long prime[MAXN],tot=0;12 bool isPrime[MAXN]; 13 LL k,num[MAXN],res[MAXN];14 void getprime(){15 memset(isPrime, true, sizeof(isPrime));16 for(int i=2;i
MAXN) break;22 isPrime[i*prime[j]]=false;23 if(i%prime[j]==0) break;24 }25 }26 return ;27 }28 LL cal(LL l, LL r)29 {30 LL ans=0,tmp,cnt;31 for(int i=1;i<=tot;i++)32 {33 LL p=(l+prime[i]-1)/prime[i]*prime[i];34 while(p<=r){35 cnt=0;36 while(num[it]%prime[i]==0){37 num[it]/=prime[i];38 cnt++;39 }40 res[it]=res[it]*(k*cnt+1)%MOD;41 p+=prime[i];42 }43 }44 for(LL p=l;p<=r;p++){45 if(num[it]==1)46 ans+=res[it];47 else48 ans+=res[it]*(k+1);49 ans%=MOD;50 }51 return ans;52 }53 int main()54 {55 int T;56 LL l,r;57 getprime();58 scanf("%d", &T);59 while(T--)60 {61 scanf("%lld %lld %lld", &l, &r, &k);62 for(LL p=l;p<=r;p++){63 res[it]=1;64 num[it]=p;65 }66 LL res=cal(l, r);67 printf("%lld\n", res);68 }69 }

 

转载于:https://www.cnblogs.com/MasterSpark/p/7291193.html

你可能感兴趣的文章
not accessible due to restriction on required library
查看>>
Python计算&绘图——曲线拟合问题(转)
查看>>
数学计算不精确的芯片能帮助解决难题
查看>>
selenium-webdriver(python) (十四) -- webdriver原理
查看>>
《树莓派Python编程入门与实战》——1.3 哪些树莓派外设是必须的
查看>>
《编译与反编译技术实战 》一3.2 词法分析器的手工实现
查看>>
《计算机存储与外设》----1.5 虚拟存储器和存储器管理
查看>>
《 Python树莓派编程》——3.4 利用Python进行编程
查看>>
从损坏的 Linux EFI 安装中恢复
查看>>
Git Rebase教程: 用Git Rebase让时光倒流
查看>>
柏林纪行(上):整体感受
查看>>
《Python数据分析》一1.7 学习手册页
查看>>
Centos7 下建立 Docker 桥接网络
查看>>
《Hack与HHVM权威指南》——1.6 类型推理
查看>>
《CCNA学习指南:数据中心(640-911)》——导读
查看>>
《精通 ASP.NET MVC 5》----1.3 ASP.NET MVC的关键优点
查看>>
《JavaScript框架设计》——1.5 主流框架引入的机制——domReady
查看>>
《正则表达式经典实例(第2版)》——2.3 匹配多个字符之一
查看>>
深入实践Spring Boot1.3.1 Maven依赖管理
查看>>
API网关的iOS SDK已经支持 IPV6
查看>>