【bzoj3930】【SCOI2015】【选数】【容斥】

2024-02-20 15:38

本文主要是介绍【bzoj3930】【SCOI2015】【选数】【容斥】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

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

Input

输入一行,包含4个空格分开的正整数,依次为N,K,L和H。

Output

输出一个整数,为所求方案数。

Sample Input

2 2 2 4

Sample Output

3

HINT

 样例解释


所有可能的选择方案:(2, 2), (2, 3), (2, 4), (3, 2), (3, 3), (3, 4), (4, 2), (4, 3), (4, 4)

其中最大公约数等于2的只有3组:(2, 2), (2, 4), (4, 2)

对于100%的数据,1≤N,K≤10^9,1≤L≤H≤10^9,H-L≤10^5
题解:本来想的是莫比乌斯反演,然后发现很麻烦而且复杂度不是很科学就放弃了。
考虑原题让你求l-r中gcd(i,j)=k的个数。
等价于求l/k-r/k中gcd(i,j)=1的个数.
我们设d[i]表示l/k-r/k中gcd(i,j)=i的个数,
容斥一下即可.注意特判所有数都相等的情况。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#define P 1000000007
#define LL long long
#define N 100010
using namespace std;
LL ans,d[N],l,r,ll,rr,L,R;
int sum,t,k,n,f;
LL power(LL a,int b){LL ans;for(ans=1;b;b>>=1,(a*=a)%=P) if (b&1) (ans*=a)%=P;return ans;
}
int main(){scanf("%d%d%d%d",&n,&k,&L,&R);if (k>=L&&k<=R) f=1;l=(L-1)/k;r=R/k;t=r-l;for (int i=t;i>=1;i--){ll=l/i;rr=r/i;LL sum(0);int tt=rr-ll;if (rr>ll){sum=(power((LL)(rr-ll),n)-tt+P)%P;for (int j=i<<1;j<=t;j+=i) sum=(sum-d[j]+P)%P;}d[i]=sum;}cout<<d[1]+f<<endl;
}



这篇关于【bzoj3930】【SCOI2015】【选数】【容斥】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/728695

相关文章

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

hdu4407容斥原理

题意: 有一个元素为 1~n 的数列{An},有2种操作(1000次): 1、求某段区间 [a,b] 中与 p 互质的数的和。 2、将数列中某个位置元素的值改变。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu

hdu4059容斥原理

求1-n中与n互质的数的4次方之和 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWrit

容斥问题

一、填空题 1.一个班有45个小学生,统计借课外书的情况是:全班学生都借有语文或数学课外书.借语文课外书的有39人,借数学课外书的有32人.语文、数学两种课外书都借的有     人. 3.在1~100的自然数中,是5的倍数或是7的倍数的数有     个. 4.某区100个外语教师懂英语或俄语,其中懂英语的75人,既懂英语又懂俄语的20人,那么懂俄语的教师为     人. 5.六一班

【HDU】2204 Eddy's爱好 容斥原理

传送门:【HDU】2204 Eddy's爱好 题目分析:首先,对于所有形如M^K的数我们都可以转化成M^(p1^k1 * p2^k2 * p3^k3 * ... )的形式,其中p1,p2,p3..为素数。则所有的M^K都可以转化成M'^p,其中p为素数。我们意识到2^60>10^18,所以只要求出前60以内的所有素数即可。然后,由于2*3*5*7>60,其中一个K的质因数最多只有三种。

【ZOJ】3881 From the ABC conjecture【暴力容斥】

传送门:【ZOJ】3881 From the ABC conjecture 复杂度大概 O(N0.67) O(N^{0.67}),我也不会算www,首先转换一下(我们是根据积性函数打表找规律得到的,也可以推出来)使得: g(N)=∏pi ϵ N(pia+1) g(N)=\prod_{pi~\epsilon ~N} (pi^a+1) 暴力展开发现贡献为: h(N)=

HDU 5514 Frogs (容斥定理)

题意:有n个青蛙在由m个石头组成的圆圈上跳。告诉你每个青蛙每次跳的步长,计算所有被青蛙跳过的石头的编号和。 解法:http://www.cnblogs.com/qscqesze/p/4933949.html #include<bits/stdc++.h>using namespace std;#define LL long long#define pb push_back#defin

算法-容斥原理

venn图: 如何求三个圆圈的面积之和? 此时,||不代表绝对值,代表集合的个数  解题思路: 实际上,我们不需要知道每个集合中的元素具体是什么,只需要知道每个集合的大小 例如 ,表示10以内能够被2整除的数有5个,每个集合的大小可以根据来确定。 那么的集合大小怎么算呢,其实就是 最后就是如何用代码表示每个集合状态(选或者没有选)? 在这里使用二进制,以 m

洛谷题解 - P1036 [NOIP2002 普及组] 选数

目录 题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示代码 题目描述 已知 n n n 个整数 x 1 , x 2 , ⋯ , x n x_1,x_2,\cdots,x_n x1​,x2​,⋯,xn​,以及 1 1 1 个整数 k k k( k < n k<n k<n)。从 n n n 个整数中任选 k k k 个整数相加,可分别得到一系列的和。例

poj 1091 跳蚤(不定方程+容斥)

跳蚤 Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 8731 Accepted: 2605 Description Z城市居住着很多只跳蚤。在Z城市周六生活频道有一个娱乐节目。一只跳蚤将被请上一个高空钢丝的正中央。钢丝很长,可以看作是无限长。节目主持人会给该跳蚤发一张卡片。卡片上写有N+1个自然数。其中最