CQOI2015 选数

粘题目描述:

我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案。

小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一步研究。

然而他很快发现工作量太大了,于是向你寻求帮助。

你的任务很简单,小z会告诉你一个整数K,你需要回答他最大公约数刚好为K的选取方案有多少个。由于方案数较大,你只需要输出其除以1000000007的余数即可。

题解:

容斥+递推。如果我们在区间[l,r]种任取n个不全相同的数时,他们的gcd一定<=r-l+1(贝祖)。

然后就很好搞了,l=(l+k-1)/k,h=h/k。

然后f[ i ]表示合法区间内选n个数不全相同且gcd==i的方案。

容斥之前是x^n-x,然后逆向处理即可。

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MOD 1000000007
#define N 100050
#define ll long long
int n,k,l,h;
ll f[N];
ll fastpow(ll x,int y)
{
    ll ret = 1ll;
    while(y)
    {
        if(y&1)ret=ret*x%MOD;
        x=x*x%MOD;
        y>>=1;
    }
    return ret;
}
int main()
{
    scanf("%d%d%d%d",&n,&k,&l,&h);
    l=(l+k-1)/k,h=h/k;
    for(int i=1;i<=(h-l+1);i++)
    {
        int x = (h/i)-((l+i-1)/i)+1;
        f[i]=fastpow(x,n)-x;
    }
    for(int i=(h-l+1);i>=1;i--)
    {
        for(int j=2;i*j<=(h-l+1);j++)
        {
            f[i]=(f[i]-f[i*j]+MOD)%MOD;
        }
    }
    printf("%lld\n",f[1]+(l==1));
    return 0;
}

原文地址:https://www.cnblogs.com/LiGuanlin1124/p/10048188.html

时间: 2024-11-01 15:00:49

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

BZOJ3930 [CQOI2015]选数 【容斥】

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

Luogu P3172 [CQOI2015]选数

这题的反演做法好像很不可食用啊还得套一个杜教筛 我们注意到题目一个重要的性质:\(H-L\le10^5\),看起来可以好好利用一下. 我们首先转化问题,类似于许多和\(\gcd\)有关的问题,我们将原来的最大公约数\(K\)想办法变成\(1\) 这个怎么处理呢,其实很简单,将\(L\)变为\(\lceil \frac{L}{K}\rceil\),将\(R\)变为\(\lfloor\frac{H}{K}\rfloor\). 显然这样我们把问题转化为:在\([L,H]\)种取\(N\)次数使它们的\

bzoj3930 [CQOI2015]选数

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

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

CQOI2015 选数+酱油记

昨天我们考了CQOI2015的题..那还是找一道最可做的写一写好了>.<.. 考试的结果还是不多说了..反正我是知道暴力乱搞高精度的重要性了..骗分的OI才有随机性才好玩,嘛... 成绩不忍直视但竟然还没出前三..感人肺腑... 怎么觉得自从看了CLJ犇的Blog之后越来越喜欢模仿他们的语气卖萌了呢~~ 还是总结一下考试好了,嗯... 感觉我考的时候还是不太在状态..然后有的题目想出来了之后就不太想打了= =..然后四处duang啊duang..时间一下子就过去了呢>.< 根据C老

【递推】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