BZOJ 3930 CQOI2015 选数 莫比乌斯反演

题目见 http://pan.baidu.com/s/1o6zajc2

此外不知道H-L<=10^5这个条件是干嘛的。。。。

#include <map>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 10001000
#define INF 0x3f3f3f3f
#define MOD 1000000007
using namespace std;
int mu[M],prime[1001001],tot;
bool not_prime[M];
map<int,long long> mu_sum;
long long n,d,l,r;
void Linear_Shaker()
{
	int i,j;
	mu[1]=1;
	for(i=2;i<=10000000;i++)
	{
		if(!not_prime[i])
		{
			mu[i]=-1;
			prime[++tot]=i;
		}
		for(j=1;prime[j]*i<=10000000;j++)
		{
			not_prime[prime[j]*i]=true;
			if(i%prime[j]==0)
			{
				mu[prime[j]*i]=0;
				break;
			}
			mu[prime[j]*i]=-mu[i];
		}
	}
	for(i=1;i<=10000000;i++)
		mu[i]+=mu[i-1];
}
long long Mu_Sum(int x)
{
	if(x<=10000000)
		return mu[x];
	if(mu_sum.find(x)!=mu_sum.end())
		return mu_sum[x];
	long long i,last,re=1;
	for(i=1;i<=x;i=last+1)
	{
		last=x/(x/i);
		if(x/i-1)
			re-=(Mu_Sum(last)-Mu_Sum(i-1))*(x/i-1);
	}
	return mu_sum[x]=re;
}
long long Quick_Power(long long x,int y)
{
	long long re=1;
	while(y)
	{
		if(y&1) (re*=x)%=MOD;
		(x*=x)%=MOD; y>>=1;
	}
	return re;
}
long long Solve()
{
	long long i,last,re=0;
	for(i=1;i<=r;i=last+1)
	{
		last=min(r/(r/i),l/i?(l/(l/i)):INF);
		re+=(Mu_Sum(last)-Mu_Sum(i-1))*Quick_Power(r/i-l/i,n);
		re%=MOD;
	}
	return (re%MOD+MOD)%MOD;
}
int main()
{
	cin>>n>>d>>l>>r;
	l=(l-1)/d;r=r/d;
	Linear_Shaker();
	cout<<Solve()<<endl;
}
时间: 2024-10-29 19:06:58

BZOJ 3930 CQOI2015 选数 莫比乌斯反演的相关文章

BZOJ 3930: [CQOI2015]选数

3930: [CQOI2015]选数 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1130  Solved: 532[Submit][Status][Discuss] Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一步研究.然而他很快发现工作量太大了,于是向你寻求帮助.你的任务很简

BZOJ 3930: [CQOI2015]选数 递推

3930: [CQOI2015]选数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=3930 Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一步研究.然而他很快发现工作量太大了,于是向你寻求帮助

【刷题】BZOJ 3930 [CQOI2015]选数

Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一步研究.然而他很快发现工作量太大了,于是向你寻求帮助.你的任务很简单,小z会告诉你一个整数K,你需要回答他最大公约数刚好为K的选取方案有多少个.由于方案数较大,你只需要输出其除以1000000007的余数即可. Input 输入一行,包含4个空格分开的正整数,依次为N,K,L和H. O

【递推】BZOJ 3930: [CQOI2015]选数

Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一步研究.然而他很快发现工作量太大了,于是向你寻求帮助.你的任务很简单,小z会告诉你一个整数K,你需要回答他最大公约数刚好为K的选取方案有多少个.由于方案数较大,你只需要输出其除以1000000007的余数即可. Input 输入一行,包含4个空格分开的正整数,依次为N,K,L和H. O

luogu3172 [CQOI2015]选数 莫比乌斯反演+杜教筛

link 题目大意:有N个数,每个数都在区间[L,H]之间,请求出所有数的gcd恰好为K的方案数 推式子 首先可以把[L,H]之间的数字gcd恰好为K转化为[(L-1)/K+1,H/K]之间数字gcd恰好为1 然后就可以反演了 下面手误把所有的H都打成了R \(\sum_{i_1=L}^R\sum_{i_2=L}^R\dots\sum_{i_N=L}^R[\gcd(i_1,i_2,\dots,i_N)=1]\) \(\sum_{i_1=L}^R\sum_{i_2=L}^R\dots\sum_{i

3930: [CQOI2015]选数|递推|数论

题目让求从区间[L,H]中可重复的选出n个数使其gcd=k的方案数 转化一下也就是从区间[?Lk?,?Hk?]中可重复的选出n个数使其gcd=1的方案数 然后f[i]表示gcd=i的方案数,考虑去掉所有的数都是重复的情况,这种情况最后在判断一下加上 f[i]=sum?∑i|jf[j] #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<c

BZOJ 2734 集合选数(状态压缩DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2734 题意:给出一个由1到n的数字组成的集合.定义合法子集为若x在子集中则2x.3x均不能在子集中.求有多少个合法的子集. 思路: 1   3    9 2   6    12 4   12   36 对于上面的矩阵,我们发现就等价于不选相邻数字的方案数.因此枚举每个还没有用到的数字,建立以该数字为左上角的矩阵.接着就是状态压缩DP. int a[N][N]; i64 f[2][1<<

BZOJ3930 [CQOI2015]选数 【容斥】

题目 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一步研究.然而他很快发现工作量太大了,于是向你寻求帮助.你的任务很简单,小z会告诉你一个整数K,你需要回答他最大公约数刚好为K的选取方案有多少个.由于方案数较大,你只需要输出其除以1000000007的余数即可. 输入格式 输入一行,包含4个空格分开的正整数,依次为N,K,L和H. 输出格式 输出一个整数

BZOJ3930:[CQOI2015]选数——题解

http://www.lydsy.com/JudgeOnline/problem.php?id=3930 https://www.luogu.org/problemnew/show/P3172#sub 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一步研究.然而他很快发现工作量太大了,于是向你寻求帮助.你的任务很简单,小z会告诉你一个整数K,你需要回答他最