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
输入数据包括2个数:a, b,中间用空格分隔。(1≤a≤b≤10^9)
Output
输出a~b里每个数字的有趣约数个数之和。
Input示例
1 10
Output示例
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[莫比乌斯函数]的更多相关文章

  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. [学习OpenCV攻略][011][显示图片]

    学习资料: http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/tutorials.html   包含头文件 core.hpp:包含 ...

  2. [学习OpenCV攻略][003[初试牛刀——显示图片]

    cvLoadImage(路径) 加载指定路径的图片到内存 cvNamedWindow("窗口名称", 属性) 创建窗口,窗口名称用来被其他函数引用,属性:0表示窗口大小不变,CV_ ...

  3. CentOS系统下Redis安装和自启动配置的步骤

    相信大家都知道Redis是一个C实现的基于内存.可持久化的键值对数据库,在分布式服务中常作为缓存服务.所以这篇文章将详细介绍在CentOS系统下如何从零开始安装到配置启动服务.有需要的可以参考借鉴. ...

  4. Phpstorm10 主题下载

    ================================================================================ submit:主题 http://ww ...

  5. different between<A Href> and <jsp: forward>

    i want to access Servelt by hyperlink in a jsp web site connection.jsp <%@ page contentType=" ...

  6. 03 整合IDEA+Maven+SSM框架的高并发的商品秒杀项目之web层

    Github:https://github.com/nnngu 项目源代码:https://github.com/nnngu/nguSeckill 前端交互流程设计 对于一个系统,需要产品经理.前端工 ...

  7. linux pagecache限制与查看

    在linux服务器使用过程中,由于linux对内存的使用原则是能cache就尽量cache,所以会出现pagecache占用很多的情况. suse的版本有一个pagecachelimit的功能,cen ...

  8. Javascript学习--烟花

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  9. 2017-06-22(locate shutdown half poweroff init0 reboot init 6)

    locate locate 文件搜索命令 格式:locate  [文件名] locate 在后台数据库中(/var/lib/mlocate/mlocate.db)按文件名搜索,速度快 刚刚新建的文件, ...

  10. python3 第八章 - 完善九九乘法表

    前面我们在第四章的时候挖了个坑:怎么用优雅的方式来打印九九乘法表.这一章我们就来填上这个坑. 首先,我们再来看下九九乘法表是什么样子的 1 x 1 = 1 1 x 2 = 2 2 x 2 = 4 1 ...