51Nod 欢乐手速场1 C 开心的小Q[莫比乌斯函数]
- 输入数据包括2个数:a, b,中间用空格分隔。(1≤a≤b≤10^9)
- 输出a~b里每个数字的有趣约数个数之和。
- 1 10
- 4
- 标解:http://www.51nod.com/contest/problemSolution.html#!problemId=1742
- 里面的式子改写一开始一直不明白,稍微有点明白了,说说另一种想的方法吧
最暴力的是枚举数字再枚举约数看看是不是平方因子数了
一个简单的优化是枚举约数i,约数i的贡献(倍数的数量)就是[n/i]
但还是会T
一个巧妙的想法是我们枚举是几倍,当前枚举的是i倍,那么满足i倍<=n的数字就是<=[n/i],答案加上<=[n/i]的平方因子数的个数,就是标解中最后的式子了
计算的时候用了两次分块n/(i*i)和n/i做到O(n^2/3)
然而比只一次分块还慢是什么鬼?sqrt的问题吗
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- #include <cmath>
- using namespace std;
- typedef long long ll;
- const int N=1e5+;
- inline int read(){
- char c=getchar();ll x=,f=;
- while(c<''||c>''){if(c=='-')f=-;c=getchar();}
- while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
- return x*f;
- }
- int a,b;
- bool notp[N];
- int p[N],mu[N];
- void sieve(int n){
- mu[]=;
- for(int i=;i<=n;i++){
- if(!notp[i]) p[++p[]]=i,mu[i]=-;
- for(int j=;j<=p[]&&i*p[j]<=n;j++){
- notp[i*p[j]]=;
- if(i%p[j]==) break;
- mu[i*p[j]]=-mu[i];
- }
- }
- //for(int i=1;i<=n;i++) printf("mu %d %d\n",i,mu[i]);
- //for(int i=1;i<=n;i++) mu[i]+=mu[i-1];
- }
- //int F(int n){
- // int _=0,r=0,m=sqrt(n);
- // for(int i=1;i<=m;i=r+1){
- // r=n/(n/(i*i));
- // _+=n/(i*i)*(mu[r]-mu[i-1]);
- // }
- // return n-_;
- //}
- int f(int n){
- int _=,m=sqrt(n);
- for(int i=;i<=m;i++)
- _+=n/(i*i)*mu[i];
- return n-_;
- }
- ll S(int n){//printf("n %d\n",n);
- ll ans=;int r=;
- for(int i=;i<=n;i=r+){
- r=n/(n/i);
- ans+=(r-i+)*f(n/i);
- //printf("f %d %d %d %d\n",n/i,i,r,f(n/i));
- }
- return ans;
- }
- int main(){
- //freopen("in","r",stdin);
- a=read();b=read();
- sieve(sqrt(b)+);
- printf("%lld",S(b)-S(a-));
- }
一次分块
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- #include <cmath>
- using namespace std;
- typedef long long ll;
- const int N=1e5+;
- inline int read(){
- char c=getchar();ll x=,f=;
- while(c<''||c>''){if(c=='-')f=-;c=getchar();}
- while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
- return x*f;
- }
- int a,b;
- bool notp[N];
- int p[N],mu[N];
- void sieve(int n){
- mu[]=;
- for(int i=;i<=n;i++){
- if(!notp[i]) p[++p[]]=i,mu[i]=-;
- for(int j=;j<=p[]&&i*p[j]<=n;j++){
- notp[i*p[j]]=;
- if(i%p[j]==) break;
- mu[i*p[j]]=-mu[i];
- }
- }
- //for(int i=1;i<=n;i++) printf("mu %d %d\n",i,mu[i]);
- for(int i=;i<=n;i++) mu[i]+=mu[i-];
- }
- int F(int n){//printf("F %d\n",n);
- int _=,r=,m=sqrt(n);
- for(int i=;i<=m;i=r+){
- r=sqrt(n/(n/(i*i)));//printf("r %d\n",r);
- _+=n/(i*i)*(mu[r]-mu[i-]);
- }
- return n-_;
- }
- ll S(int n){//printf("n %d\n",n);
- ll ans=;int r=;
- for(int i=;i<=n;i=r+){
- r=n/(n/i);
- ans+=(r-i+)*F(n/i);
- //printf("F %d %d %d %d\n",n/i,i,r,F(n/i));
- }
- return ans;
- }
- int main(){
- //freopen("in","r",stdin);
- a=read();b=read();
- sieve(sqrt(b)+);
- printf("%lld",S(b)-S(a-));
- }
51Nod 欢乐手速场1 C 开心的小Q[莫比乌斯函数]的更多相关文章
- 51Nod 欢乐手速场1 B 序列变换[容斥原理 莫比乌斯函数]
序列变换 alpq654321 (命题人) 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 lyk有两序列a和b. lyk想知道存在多少对x,y,满足以下两个条件. 1:gcd( ...
- 51Nod 欢乐手速场1 A Pinball[DP 线段树]
Pinball xfause (命题人) 基准时间限制:1 秒 空间限制:262144 KB 分值: 20 Pinball的游戏界面由m+2行.n列组成.第一行在顶端.一个球会从第一行的某一列出发 ...
- 1742 开心的小Q
如果一个数字存在一个约数是完全平方数,那么小Q就认为这个数是有趣的. 小Q喜欢收集有趣的数字,每找到一个有趣的数,小Q就会变得很开心. 小Q发现12是有趣的,18也是有趣的,它们都是36的约数,而在3 ...
- 【51nod】1742 开心的小Q
题解 我们由于莫比乌斯函数如果有平方数因子就是0,那么我们可以列出这样的式子 \(\sum_{i = 1}^{n} \sum_{d|i} (1 - |\mu(d)|)\) 然后枚举倍数 \(\sum_ ...
- Contest - 2014 SWJTU ACM 手速测试赛(2014.10.31)
题目列表: 2146 Problem A [手速]阔绰的Dim 2147 Problem B [手速]颓废的Dim 2148 Problem C [手速]我的滑板鞋 2149 Problem D [手 ...
- 手速太慢QAQ
显然D是个细节题,但是还剩1h时看眼榜还没人过EF,只好冷静写D,大概思路是任何时候如果min(n,m)<=2,max(n,m)<=4暴搜,否则直接贪心是很对的,即第一步让S.T长度平均化 ...
- 51nod 1244 莫比乌斯函数之和
题目链接:51nod 1244 莫比乌斯函数之和 题解参考syh学长的博客:http://www.cnblogs.com/AOQNRMGYXLMV/p/4932537.html %%% 关于这一类求积 ...
- 51nod 1240 莫比乌斯函数
题目链接:51nod 1240 莫比乌斯函数 莫比乌斯函数学习参考博客:http://www.cnblogs.com/Milkor/p/4464515.html #include<cstdio& ...
- nyoj 49 开心的小明
开心的小明 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 小明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天 ...
随机推荐
- android studio无法识别含有rcs包名的jar
http://blog.csdn.net/JingleYe/article/details/70048943 android studio无法识别含有rcs包名的jar android stu ...
- QQ群友在线/离线,如何测试?
上篇文章『QQ好友在线/离线,如何测试?』针对即时通讯的"状态"进行了分析和总结,主要说到了QQ好友在线/离线实现方案,测试过程中需要注意的测试点. 针对好友状态实时性的要求需要使 ...
- VMware workstation 虚拟机中安装乌班图及其兼容性问题
之前我在虚拟机中安装乌班图,是先安装好虚拟机,然后将预先下载好的乌班图镜像文件导入安装,这样安装起来还是有些繁琐的,中间要设置好多东西.今天领导给我拷了个虚拟机,还有乌班图的安装文件,是这样的. 对于 ...
- tomcat服务器一闪而过解决方法
JDK没有配置,下载JDK安装到电脑上,然后在电脑->属性->高级系统设置->环境变量,将JDK中bin文件的目录E:\Program Files (x86)\Java\jre7\b ...
- 客户端怎么查看SVN的代码库
安装SVN客户端,比如TortoiseSVN,然后将代码库checkout到本地,或者通过客户端的版本库浏览器直接连接SVN服务器查看代码库的目录结构. 如果SVN服务器端安装的时候是和Apache集 ...
- 如何在vue里面访问php?
如果你选择前端使用vue框架,后端用PHP开发,服务器就不用node了,用Apache就好了 开发中,看你是否想进行前后端的分离.如果你不想进行前后端的分离,可以将vue的项目build之后放到php ...
- JS和H5做一个音乐播放器,附带源码
http://mp.weixin.qq.com/s/KpXT9X46AMlUVXQvpHuXGQ 效果图: 实现的功能 1.首页 2.底部播放控件 3.播放页面 4.播放列表 5.排行榜 6.音乐搜索 ...
- phpstudy本地搭建域名访问
http://blog.csdn.net/camillezj/article/details/54694554 步骤如下: 一.hosts配置: 1.用编辑器打开hosts文件,位置:C:\Windo ...
- 谈谈Python、Java与AI
Python好像天生是为AI而生的,随着AI的火热,特别是用Python写的TensorFlow越来越火,Python的热度越来越高,就像当年Java就是随着互联网火起来的感觉.在我的工作中,Pyth ...
- cobol
过程部的语句一般从B区开始书写. ACCEPT A,B (x) DISPLAY T1,T2.(O)显示在一行上 DISPLAY T1 DISPLAY T2 (O)显示在两行上 read ...