tangjz (命题人)
quailty (测试)
 
基准时间限制:1 秒 空间限制:131072 KB 分值: 80
如果一个数字存在一个约数是完全平方数,那么小Q就认为这个数是有趣的。

小Q喜欢收集有趣的数字,每找到一个有趣的数,小Q就会变得很开心。

小Q发现12是有趣的,18也是有趣的,它们都是36的约数,而在36的约数中,还有3个数是有趣的,它们是4、9、36。
小Q很好奇,在a~b里每个数字各有多少个有趣的约数,由于a和b太大了,所以他只想知道这些个数之和是多少。
例如4有1个有趣的约数,8有2个有趣的约数,9有1个有趣的约数,所以1~10里每个数的有趣约数个数之和是4。
Input
  1. 输入数据包括2个数:a, b,中间用空格分隔。(1ab10^9
Output
  1. 输出a~b里每个数字的有趣约数个数之和。
Input示例
  1. 1 10
Output示例
  1. 4

  1. 标解:http://www.51nod.com/contest/problemSolution.html#!problemId=1742
  2.  
  3. 里面的式子改写一开始一直不明白,稍微有点明白了,说说另一种想的方法吧
    最暴力的是枚举数字再枚举约数看看是不是平方因子数了
    一个简单的优化是枚举约数i,约数i的贡献(倍数的数量)就是[n/i]
    但还是会T
    一个巧妙的想法是我们枚举是几倍,当前枚举的是i倍,那么满足i倍<=n的数字就是<=[n/i],答案加上<=[n/i]的平方因子数的个数,就是标解中最后的式子了
    计算的时候用了两次分块n/(i*i)和n/i做到O(n^2/3)
    然而比只一次分块还慢是什么鬼?sqrt的问题吗
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <cmath>
  6. using namespace std;
  7. typedef long long ll;
  8. const int N=1e5+;
  9. inline int read(){
  10. char c=getchar();ll x=,f=;
  11. while(c<''||c>''){if(c=='-')f=-;c=getchar();}
  12. while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
  13. return x*f;
  14. }
  15. int a,b;
  16. bool notp[N];
  17. int p[N],mu[N];
  18. void sieve(int n){
  19. mu[]=;
  20. for(int i=;i<=n;i++){
  21. if(!notp[i]) p[++p[]]=i,mu[i]=-;
  22. for(int j=;j<=p[]&&i*p[j]<=n;j++){
  23. notp[i*p[j]]=;
  24. if(i%p[j]==) break;
  25. mu[i*p[j]]=-mu[i];
  26. }
  27. }
  28. //for(int i=1;i<=n;i++) printf("mu %d %d\n",i,mu[i]);
  29. //for(int i=1;i<=n;i++) mu[i]+=mu[i-1];
  30. }
  31. //int F(int n){
  32. // int _=0,r=0,m=sqrt(n);
  33. // for(int i=1;i<=m;i=r+1){
  34. // r=n/(n/(i*i));
  35. // _+=n/(i*i)*(mu[r]-mu[i-1]);
  36. // }
  37. // return n-_;
  38. //}
  39. int f(int n){
  40. int _=,m=sqrt(n);
  41. for(int i=;i<=m;i++)
  42. _+=n/(i*i)*mu[i];
  43. return n-_;
  44. }
  45. ll S(int n){//printf("n %d\n",n);
  46. ll ans=;int r=;
  47. for(int i=;i<=n;i=r+){
  48. r=n/(n/i);
  49. ans+=(r-i+)*f(n/i);
  50. //printf("f %d %d %d %d\n",n/i,i,r,f(n/i));
  51. }
  52. return ans;
  53. }
  54. int main(){
  55. //freopen("in","r",stdin);
  56. a=read();b=read();
  57. sieve(sqrt(b)+);
  58. printf("%lld",S(b)-S(a-));
  59. }

一次分块

  1.  
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <cmath>
  6. using namespace std;
  7. typedef long long ll;
  8. const int N=1e5+;
  9. inline int read(){
  10. char c=getchar();ll x=,f=;
  11. while(c<''||c>''){if(c=='-')f=-;c=getchar();}
  12. while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
  13. return x*f;
  14. }
  15. int a,b;
  16. bool notp[N];
  17. int p[N],mu[N];
  18. void sieve(int n){
  19. mu[]=;
  20. for(int i=;i<=n;i++){
  21. if(!notp[i]) p[++p[]]=i,mu[i]=-;
  22. for(int j=;j<=p[]&&i*p[j]<=n;j++){
  23. notp[i*p[j]]=;
  24. if(i%p[j]==) break;
  25. mu[i*p[j]]=-mu[i];
  26. }
  27. }
  28. //for(int i=1;i<=n;i++) printf("mu %d %d\n",i,mu[i]);
  29. for(int i=;i<=n;i++) mu[i]+=mu[i-];
  30. }
  31. int F(int n){//printf("F %d\n",n);
  32. int _=,r=,m=sqrt(n);
  33. for(int i=;i<=m;i=r+){
  34. r=sqrt(n/(n/(i*i)));//printf("r %d\n",r);
  35. _+=n/(i*i)*(mu[r]-mu[i-]);
  36. }
  37. return n-_;
  38. }
  39. ll S(int n){//printf("n %d\n",n);
  40. ll ans=;int r=;
  41. for(int i=;i<=n;i=r+){
  42. r=n/(n/i);
  43. ans+=(r-i+)*F(n/i);
  44. //printf("F %d %d %d %d\n",n/i,i,r,F(n/i));
  45. }
  46. return ans;
  47. }
  48. int main(){
  49. //freopen("in","r",stdin);
  50. a=read();b=read();
  51. sieve(sqrt(b)+);
  52. printf("%lld",S(b)-S(a-));
  53. }
  1.  
  1.  

51Nod 欢乐手速场1 C 开心的小Q[莫比乌斯函数]的更多相关文章

  1. 51Nod 欢乐手速场1 B 序列变换[容斥原理 莫比乌斯函数]

    序列变换 alpq654321 (命题人)   基准时间限制:1 秒 空间限制:131072 KB 分值: 40 lyk有两序列a和b. lyk想知道存在多少对x,y,满足以下两个条件. 1:gcd( ...

  2. 51Nod 欢乐手速场1 A Pinball[DP 线段树]

    Pinball xfause (命题人)   基准时间限制:1 秒 空间限制:262144 KB 分值: 20 Pinball的游戏界面由m+2行.n列组成.第一行在顶端.一个球会从第一行的某一列出发 ...

  3. 1742 开心的小Q

    如果一个数字存在一个约数是完全平方数,那么小Q就认为这个数是有趣的. 小Q喜欢收集有趣的数字,每找到一个有趣的数,小Q就会变得很开心. 小Q发现12是有趣的,18也是有趣的,它们都是36的约数,而在3 ...

  4. 【51nod】1742 开心的小Q

    题解 我们由于莫比乌斯函数如果有平方数因子就是0,那么我们可以列出这样的式子 \(\sum_{i = 1}^{n} \sum_{d|i} (1 - |\mu(d)|)\) 然后枚举倍数 \(\sum_ ...

  5. Contest - 2014 SWJTU ACM 手速测试赛(2014.10.31)

    题目列表: 2146 Problem A [手速]阔绰的Dim 2147 Problem B [手速]颓废的Dim 2148 Problem C [手速]我的滑板鞋 2149 Problem D [手 ...

  6. 手速太慢QAQ

    显然D是个细节题,但是还剩1h时看眼榜还没人过EF,只好冷静写D,大概思路是任何时候如果min(n,m)<=2,max(n,m)<=4暴搜,否则直接贪心是很对的,即第一步让S.T长度平均化 ...

  7. 51nod 1244 莫比乌斯函数之和

    题目链接:51nod 1244 莫比乌斯函数之和 题解参考syh学长的博客:http://www.cnblogs.com/AOQNRMGYXLMV/p/4932537.html %%% 关于这一类求积 ...

  8. 51nod 1240 莫比乌斯函数

    题目链接:51nod 1240 莫比乌斯函数 莫比乌斯函数学习参考博客:http://www.cnblogs.com/Milkor/p/4464515.html #include<cstdio& ...

  9. nyoj 49 开心的小明

    开心的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 小明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天 ...

随机推荐

  1. android studio无法识别含有rcs包名的jar

    http://blog.csdn.net/JingleYe/article/details/70048943     android studio无法识别含有rcs包名的jar android stu ...

  2. QQ群友在线/离线,如何测试?

    上篇文章『QQ好友在线/离线,如何测试?』针对即时通讯的"状态"进行了分析和总结,主要说到了QQ好友在线/离线实现方案,测试过程中需要注意的测试点. 针对好友状态实时性的要求需要使 ...

  3. VMware workstation 虚拟机中安装乌班图及其兼容性问题

    之前我在虚拟机中安装乌班图,是先安装好虚拟机,然后将预先下载好的乌班图镜像文件导入安装,这样安装起来还是有些繁琐的,中间要设置好多东西.今天领导给我拷了个虚拟机,还有乌班图的安装文件,是这样的. 对于 ...

  4. tomcat服务器一闪而过解决方法

    JDK没有配置,下载JDK安装到电脑上,然后在电脑->属性->高级系统设置->环境变量,将JDK中bin文件的目录E:\Program Files (x86)\Java\jre7\b ...

  5. 客户端怎么查看SVN的代码库

    安装SVN客户端,比如TortoiseSVN,然后将代码库checkout到本地,或者通过客户端的版本库浏览器直接连接SVN服务器查看代码库的目录结构. 如果SVN服务器端安装的时候是和Apache集 ...

  6. 如何在vue里面访问php?

    如果你选择前端使用vue框架,后端用PHP开发,服务器就不用node了,用Apache就好了 开发中,看你是否想进行前后端的分离.如果你不想进行前后端的分离,可以将vue的项目build之后放到php ...

  7. JS和H5做一个音乐播放器,附带源码

    http://mp.weixin.qq.com/s/KpXT9X46AMlUVXQvpHuXGQ 效果图: 实现的功能 1.首页 2.底部播放控件 3.播放页面 4.播放列表 5.排行榜 6.音乐搜索 ...

  8. phpstudy本地搭建域名访问

    http://blog.csdn.net/camillezj/article/details/54694554 步骤如下: 一.hosts配置: 1.用编辑器打开hosts文件,位置:C:\Windo ...

  9. 谈谈Python、Java与AI

    Python好像天生是为AI而生的,随着AI的火热,特别是用Python写的TensorFlow越来越火,Python的热度越来越高,就像当年Java就是随着互联网火起来的感觉.在我的工作中,Pyth ...

  10. cobol

    过程部的语句一般从B区开始书写. ACCEPT A,B (x)       DISPLAY T1,T2.(O)显示在一行上 DISPLAY  T1 DISPLAY  T2 (O)显示在两行上 read ...