题目链接





map:

//杜教筛
#include<map>
#include<cstdio>
typedef long long LL;
const int N=5e6; int mu[N+3],P[N+3],cnt;
bool Not_P[N+3];
std::map<LL,LL> sum;
//std::map<LL,LL>::iterator it; void Init()
{
mu[1]=1;
for(int i=2;i<N;++i)
{
if(!Not_P[i]) P[++cnt]=i,mu[i]=-1;
for(int j=1;j<=cnt&&i*P[j]<N;++j)
{
Not_P[i*P[j]]=1;
if(!(i%P[j])) {mu[i*P[j]]=0; break;}
mu[i*P[j]]=-mu[i];
}
}
for(int i=2;i<N;++i) mu[i]+=mu[i-1];
}
LL Calc(LL n)
{
if(n<N) return mu[n];
// if((it=sum.find(n))!=sum.end()) return it->second;//效率是几乎一样的
if(sum.count(n)) return sum[n];
LL ans=1;
for(LL nxt,i=2;i<=n;i=nxt+1)
nxt=n/(n/i),ans-=(nxt-i+1)*Calc(n/i);
return sum[n]=ans;
} int main()
{
Init();
LL a,b;scanf("%lld%lld",&a,&b);
printf("%lld",Calc(b)-Calc(a-1)); return 0;
}

数组:(使用数组这个trick存的话 对于多组询问就要重新计算了)

但是据(rqy)说map实际用到的次数并不多,所以多次询问还是直接用map吧。

//比map还要慢一点

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
typedef long long LL;
const int N=5e6; int mu[N+3],P[N+3],cnt;
LL sum2[15000],Max;
bool Not_P[N+3]; void Init()
{
mu[1]=1;
for(int i=2;i<Max;++i)
{
if(!Not_P[i]) P[++cnt]=i,mu[i]=-1;
for(int j=1;j<=cnt&&i*P[j]<Max;++j)
{
Not_P[i*P[j]]=1;
if(!(i%P[j])) {mu[i*P[j]]=0; break;}
mu[i*P[j]]=-mu[i];
}
}
for(int i=1;i<Max;++i) mu[i]+=mu[i-1];
}
const int EQU=-2333333;
LL Calc(LL n,LL mx)
{
if(n<Max) return mu[n];
if(sum2[mx/n]!=EQU) return sum2[mx/n];
LL ans=1;
for(LL nxt,i=2;i<=n;i=nxt+1)
nxt=n/(n/i),ans-=(nxt-i+1)*Calc(n/i,mx);
return sum2[mx/n]=ans;
} int main()
{
LL a,b;scanf("%lld%lld",&a,&b);
// printf("%.3lf %.3lf\n",pow(a,0.667),pow(b,0.667));
Max=pow(b,0.667), Init();
std::fill(sum2,sum2+15000,EQU); LL ans1=Calc(b,b);
std::fill(sum2,sum2+15000,EQU); LL ans2=Calc(a-1,a-1);
printf("%lld",ans1-ans2); return 0;
}

51Nod.1244.莫比乌斯函数之和(杜教筛)的更多相关文章

  1. 51 NOD 1244 莫比乌斯函数之和(杜教筛)

    1244 莫比乌斯函数之和 基准时间限制:3 秒 空间限制:131072 KB 分值: 320 难度:7级算法题 收藏 关注 莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出.梅滕斯(Mertens) ...

  2. 【51nod-1239&1244】欧拉函数之和&莫比乌斯函数之和 杜教筛

    题目链接: 1239:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1239 1244:http://www.51nod. ...

  3. 51nod1244 莫比乌斯函数之和 杜教筛

    虽然都写了,过也过了,还是觉得杜教筛的复杂度好玄学 设f*g=h,∑f=S, 则∑h=∑f(i)S(n/i下取整) 把i=1时单独拿出来,得到 S(n)=(∑h-∑2->n f(i)S(n/i下 ...

  4. 51nod 1244 莫比乌斯函数之和 【杜教筛】

    51nod 1244 莫比乌斯函数之和 莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出.梅滕斯(Mertens)首先使用μ(n)(miu(n))作为莫比乌斯函数的记号.具体定义如下: 如果一个数包含 ...

  5. [51Nod 1244] - 莫比乌斯函数之和 & [51Nod 1239] - 欧拉函数之和 (杜教筛板题)

    [51Nod 1244] - 莫比乌斯函数之和 求∑i=1Nμ(i)\sum_{i=1}^Nμ(i)∑i=1N​μ(i) 开推 ∑d∣nμ(d)=[n==1]\sum_{d|n}\mu(d)=[n== ...

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

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

  7. 51nod 1244 莫比乌斯函数之和(杜教筛)

    [题目链接] http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 [题目大意] 计算莫比乌斯函数的区段和 [题解] 利 ...

  8. [51Nod 1237] 最大公约数之和 (杜教筛+莫比乌斯反演)

    题目描述 求∑i=1n∑j=1n(i,j) mod (1e9+7)n<=1010\sum_{i=1}^n\sum_{j=1}^n(i,j)~mod~(1e9+7)\\n<=10^{10}i ...

  9. 【51nod】1239 欧拉函数之和 杜教筛

    [题意]给定n,求Σφ(i),n<=10^10. [算法]杜教筛 [题解] 定义$s(n)=\sum_{i=1}^{n}\varphi(i)$ 杜教筛$\sum_{i=1}^{n}(\varph ...

随机推荐

  1. STM32F103X datasheet学习笔记---GPIOs and AFIOs

    1.前言 每个GPIO端口有如下几个寄存器进行操作: 两个32位配置寄存器:GPIOx_CRL, GPIOx_CRH 两个32位数据寄存器:GPIOx_IDR, GPIOx_ODR 一个32位set/ ...

  2. BLE获取iphone mac地址的方法--【原创】

    本人用的BLE是TIcc2541,1.3.2协议栈 1.首先要说明的是,iphone手机将信息保护了,BLE设备读到的iphone地址是随机的,每次连接都会不同 2.下面我就具体说明如何查看手机的ma ...

  3. oracle的读写分离实现

    在MySQL作为应用系统的后台数据库时,我们常常见到这样的架构,一拖二.一拖三等等.这是用MySQL的读写分离技术,实现数据的写入和读取分别在不同的库上,提升了数据库服务能力. 同样,在Oracle作 ...

  4. ajax异步请求302

    我们知道,只有请求成功ajax才会进行回调处理,具体状态码为 status >= 200 && status < 300 || status === 304; 这一点通过查 ...

  5. sublime text 3配置c/c++编译环境

    关于gcc和g++ 安装编译器是后面所有工作的基础,如果没有编译器,后面的一切都无从谈起.在windows下使用gcc和g++,是通过安装MinGW实现的. 安装MinGW MinGW是Minimal ...

  6. java selenium操作safari

    SafariDriver是一个Safari浏览器的扩展.和Firefox类似,在selenium-safari-driver-xxx.jar包中org.openqa.selenium.safari路径 ...

  7. django----查看数据库中的sql语句

    加载setting.py 文件中 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console ...

  8. hdu6153 poj3336强化版kmp+线性dp

    发现很早以前用exkmp做过一次,但是对这题来说只要将两个串翻转一下即可转换成s2的所有前缀出现的问题 /* 给出s1,s2,求s2的每个后缀在s1中出现的次数 ans = sum{后缀长度*出现次数 ...

  9. hdu5178 尺取

    会爆int /* 给定数轴上一些点对,问有多少点对之间的距离差不超过k 点对排序后尺取法:枚举每个左边界,找到一个右边界使得 */ #include<bits/stdc++.h> #def ...

  10. MySQL索引底层实现原理

    优秀博文: MySQL索引背后的数据结构及算法原理 B树.B-树.B+树.B*树[转],mysql索引 MySQL 和 B 树的那些事 索引的本质 MySQL官方对索引的定义为:索引(Index)是帮 ...