BZOJ3930-莫比乌斯反演+杜教筛

题目的意思很简单,求给定区间内的gcd=k的个数,这应该是传统的莫比乌斯反演了。
有两种思路,一种是直接将里面变成gcd=1,然后里面看作元函数用莫比乌斯函数和恒等函数展开,然后改变求和顺序。
还有一种是构造两个函数,一个是f(x)表示x|gcd的数对个数,一个是g(x)表示x=gcd的数对个数。则f(x)等于g(d)求和,其中x|d,然后再用莫比乌斯反演得到g(x)的表达式,为了缩小求值范围我们可以也将gcd变成1,然后求g(1)。

通过这两种方法都不难得到最后的表达式,即mu(x)*f(x)求和,问题就在于如何求mu(x)上,因为这里x特别的大,我们显然是不能线性求得的,这里就要用到杜教筛。然后筛得的结果用map储存。

详见代码(因为时间不太多,然后写数学公式太复杂所以以后有时间再进行更新)

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<ctime>
#include<climits>
#include<queue>
#include<vector>
#include<set>
#include<map>
using namespace std;typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAXN=1e7+5;
const int mod=1000000007;
int prime[MAXN],mobius[MAXN],sum[MAXN];
bool check[MAXN]; int tot;
map<int,int> Sum;ll quick_pow(ll a,ll b,ll p)
{ll ret=1; a%=p;while(b){if(b&1) ret=ret*a%p; a=a*a%p; b>>=1;}return ret;
}void pre()
{tot=0; mobius[1]=1; sum[1]=1; ll x;for(int i=2;i<MAXN;i++){if(!check[i]){prime[tot++]=i; mobius[i]=-1;}for(int j=0;j<tot && (ll)prime[j]*i<(ll)MAXN;j++){x=prime[j]*i; check[x]=true;if(i%prime[j]) mobius[x]=-mobius[i];else{ mobius[x]=0;break;}}sum[i]=sum[i-1]+mobius[i];}}ll getSum(int x)
{if(x<MAXN) return sum[x];if(Sum[x]) return Sum[x];	//如果已经计算过的直接返回ll ret=1;for(int l=2,r;l<=x;l=r+1){r=x/(x/l); ret-=(r-l+1)*getSum(x/l);//杜教筛,也用分块处理}return Sum[x]=ret;
}int N,K,L,H;int main()
{pre();while(~scanf("%d%d%d%d",&N,&K,&L,&H)){L=(L-1)/K; H=H/K;	//这里要求的gcd为L-H范围内的,通过这样可以得到H/k向下取整和L/K向上取整-1的效果。实际计算的式子是H/k-L/K+1ll ans=0;for(int l=1,r;l<=H;l=r+1){r=H/(H/l);//除法分块if(l<=L) r=min(r,L/(L/l));//当有两个取整函数的时候要注意需要一个一个判断一下,因为有可能把除数变成0,这种错误很隐蔽,需要特别注意ans+=(getSum(r)-getSum(l-1))*quick_pow(H/l-L/l,N,mod); ans%=mod;}printf("%lld\n",(ans+mod)%mod);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383859.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDU1999不可摸数-暴力打表

看到这约数和第一反应是约数和函数&#xff0c;然后仔细一看不是正经的约数和函数&#xff0c;就去推去了&#xff0c;然后推的有点小复杂。&#xff08;数论函数那部分做多了&#xff09; 然后观察也没有用到什么数论部分的特殊知识啊&#xff0c;难不成真的要暴力&#xff1f…

BZOJ2818-莫比乌斯反演/欧拉函数

这道题之前没有看数论函数的时候搞懂了,想到直接用欧拉函数做,现在再来看第一个想法就是这不是莫比乌斯反演嘛. 但还是能用简单数论知识直接做出来的还是尽量做简单一点. 两种方法想到后都写的差不多对了,都爆long long 了.万恶的long long .实在是烦.切记切记,只要是乘积,或…

epoll用法整理 实现回声服务端

http://blog.csdn.net/chenxun_2010/article/details/504934811、epoll是什么&#xff1f; epoll是当前在Linux下开发大规模并发网络程序的热门人选&#xff0c;epoll 在Linux2.6内核中正式引入&#xff0c;和select相似&#xff0c;都是I/O多路复用(IO multiplexing)技术。 Li…

HDU3430-扩展中国剩余定理

刚开始一直把题意看错了。。。体测完智商急剧下降 正确理解题意以后自己写一直wa&#xff0c;而且并不知道是哪里的问题&#xff0c;在网上看了一下其他人写的改了改自己的就过了&#xff0c;可是之前的还是不知道为什么不对。 题意大概就是有一个置换群&#xff0c;问运算多…

linux shell编程多线程和wait命令学习

http://blog.csdn.net/shuanghujushi/article/details/38186303最近在使用shell做一些部署工作&#xff0c;在使用过程中&#xff0c;效率一直不高。想提高效率&#xff0c;经过分析发现&#xff0c;并不是所有操作都是需要串行的&#xff0c;一些操作是可以进行并行操作的。经…

#ifndef的作用

#ifndef是一条预编译指令&#xff0c;就是说实在编译的时候就会运行的指令。这个指令的作用很简单&#xff0c;就是字面意思&#xff0c;如果没有定义的话&#xff0c;但是却经常使用。 因为使用这个可以避免一个源文件中两次两次包含同一个文件&#xff0c;或者一个工程文件中…

C++中结构体和类的区别和联系

最主要的不同点就是结构体的访问权限为public而且不能改变&#xff0c;而类的访问权限可以改变&#xff0c;public的类和结构体基本一样。 继承上同样表现出这样的特点&#xff0c;struct是public继承的&#xff0c;而class是private继承的&#xff0c;继承的子类的访问权限取…

poll函数实现多路复用

http://blog.csdn.net/xluren/article/details/8206371 结构体pollfd struct pollfd { int fd; //file descriptor short event; //event of interest on fd short reven; //event that occurred on fd } 每一个pollfd结构体指定了一个被监视的文件描述符&…

抽象类(纯虚函数、虚函数)和虚基类(虚继承)

C多态 C的多态包括静态多态和动态多态&#xff0c;静态多态包括函数重载和泛型编程&#xff0c;动态多态包括虚函数。静态多态实在编译期间就能确定&#xff0c;动态多态实直在程序运行时才能确定。 抽象类 虚函数 在默认情况下对函数成员调用实施的是静态连编&#xff0c;…

socket通信之最简单的socket通信

http://blog.csdn.net/xluren/article/details/8043484#t15 套接字有三种类型 流式套接字&#xff08;SOCK_STREAM&#xff09;&#xff0c;数据报套接字&#xff08;SOCK_DGRAM&#xff09;及原始套接字。 1.流式套接字提供面向连接、可靠的数据传输服务&#xff0c;数据按字节…

Java环境配置

自己安装的时候按照一般的安装方法先配置了JDK的环境&#xff0c;能够成功显示java版本后我在安装eclipse的时候一直提示错误&#xff1a; Unfortunately the Java version needed to run Eclipse Installer couldn’t be found on your system. You need the following versio…

Linux I/O复用之select函数详解

http://blog.csdn.net/y396397735/article/details/55004775 select函数的功能和调用顺序 使用select函数时统一监视多个文件描述符的&#xff1a; 1、 是否存在套接字接收数据&#xff1f; 2、 无需阻塞传输数据的套接字有哪些? 3、 哪些套接字发生了异常&#xff1f; sel…

【Java学习笔记一】类和对象

面向对象程序设计的一个一个重要特点是&#xff1a;封装性。 这里的封装性有两方面含义&#xff1a;一是将有关的数据和操作代码封装在一个对象中形成一个基本单位&#xff0c;各个对象之间相互独立互不干扰&#xff0c;二是将对象中某些部分对外隐蔽&#xff0c;即隐蔽其内部细…

深入研究socket编程(3)——使用select函数编写客户端和服务器

http://blog.csdn.net/chenxun_2010/article/details/50488394 首先看原先《UNIX网络编程——并发服务器&#xff08;TCP&#xff09;》的代码&#xff0c;服务器代码serv.c&#xff1a; [cpp] view plaincopy #include<stdio.h> #include<sys/types.h> #inclu…

Java简单输入输出

不同于面向过程中有直接的输入输出函数&#xff0c;Java中的输入输出只能通过类来实现。 比较常见的一种是使用Scanner类 需要引入java.util包&#xff0c;即在文件开始加上语句import java.util.*;创建Scanner类对象&#xff0c;属于标准输入流。 例如Scanner snew Scanner(S…

Ubuntu安装搭建Clion环境

呜呜呜&#xff0c;太辛苦了&#xff0c;我终于安装好这个了。 大概过程就是先在官网下载安装包&#xff0c;然后解压以后用终端移动到对应文件夹下运行clin.sh 运行完以后会有一些窗口&#xff0c;第一个选择don’t~~&#xff0c;然后点击ok 接受&#xff08;你可以不接受…

UNIX网络编程——select函数的并发限制和 poll 函数应用举例

http://blog.csdn.net/chenxun_2010/article/details/50489577 一、用select实现的并发服务器&#xff0c;能达到的并发数&#xff0c;受两方面限制 1、一个进程能打开的最大文件描述符限制。这可以通过调整内核参数。可以通过ulimit -n来调整或者使用setrlimit函数设置&#x…

【Java学习笔记二】继承和多态

与C不同的是&#xff0c;在Java中&#xff0c;一个类只能直接继承另一个类&#xff0c;而不允许继承多个类&#xff0c;这个新类称为继承类、派生类或者子类&#xff0c;而被继承的类称为基类或者父类。 继承类能够继承基类的群不属性和行为。 面向对象程序设计的三大特点为&…

使用poll实现的io多路复用服务端和客户端

http://blog.csdn.net/robertkun/article/details/52269313 参考&#xff1a;http://www.cnblogs.com/Anker/p/3261006.html 使用poll实现的io多路复用服务端和客户端。 客户端通过子进程创建多个客户端连接。 客户端每隔1秒向服务端发送一个时间戳&#xff0c; 服务端接收到时…

【Java学习笔记三】抽象类与接口

对象的类型转换分为自动转换和强制转换两种 派生类向基类转换是自动转换&#xff0c;因为派生类中包含基类基类向派生类的转换是强制转换 强制类型转换是通过在转换对象前面使用圆括号运算符来实现&#xff0c;圆括号内为要转换的目标类型&#xff0c;格式为&#xff1a; (&…