[CQOI2015]选数

题目描述

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

小\(z\)很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的\(N\)个整数都求一次最大公约数,以便进一步研究。然而他很快发现工作量太大了,于是向你寻求帮助。

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

输入输出格式

输入格式:

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

输出格式:

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

说明

对于\(100\%\)的数据,\(1 \le N, K \le 10^9\),\(1 \le L \le H \le 10^9\),\(H-L \le10^5\)


暴力反演一波你会发现要求这个式子

\[\sum_{d=1}^{\lfloor\frac{r}{k}\rfloor}\mu(d)(\lfloor\frac{\lfloor\frac{r}{k}\rfloor}{d}\rfloor-\lfloor\frac{\lceil\frac{l}{k}\rceil-1}{d}\rfloor)
\]

需要使用杜教筛,不想学,发现还有一个神仙的\(DP\)

令\(r=\lfloor\frac{r}{k}\rfloor,l=\lceil\frac{l}{k}\rceil\)

问题等价于问互质的方案数

引理:区间\([l,r]\)任意两个不相等数的最大公约数的大小不会超过\(r-l\)

证明:取任意互质的数\(a,b\),将它们同乘\(m\),而\(r-l\)取最小值时\((b-a)\times m \ge m\),得证

(证明是从别处抄的,说实话不太懂QAQ)

设\(dp_{i}\)代表以\(i\)为最大公约数的数量,且所选的数不全相等。

考虑\(g_i\)为\(i\)为约数的数量,同样也是所选的不全相等。

(不全相等是处于统计方便考虑)

显然

\[g_i=(\lfloor\frac{r}{i}\rfloor-\lfloor\frac{l-1}{i}\rfloor)^n-(\lfloor\frac{r}{i}\rfloor-\lfloor\frac{l-1}{i}\rfloor)
\]

根据容斥原理

\[dp_i=g_i-\sum_{i|d}^rdp_d
\]

注意要特判\(l=1\),因为这个时候可以全相等


Code:

#include <cstdio>
#define ll long long
const int N=1e5+10;
const ll mod=1e9+7;
ll n,k,l,r;
ll dp[N];
ll quickpow(ll d,ll k)
{
ll f=1;
while(k)
{
if(k&1) f=f*d%mod;
d=d*d%mod;
k>>=1;
}
return f;
}
int main()
{
scanf("%lld%lld%lld%lld",&n,&k,&l,&r);
l=(l-1)/k+1,r=r/k;
for(ll i=1;i<=r-l;i++)
{
ll cnt=(r/i-(l-1)/i);
dp[i]=quickpow(cnt,n)-cnt;
}
for(ll i=r-l;i;i--)
for(ll j=i<<1;j<=r-l;j+=i)
(dp[i]-=dp[j])%=mod;
printf("%lld\n",(dp[1]+(l==1)+mod)%mod);
return 0;
}

2018.10.20

最新文章

  1. python lxml install
  2. GY编辑平台产品总结
  3. Maven&amp;&amp;Ant使用
  4. SendKeys:基本使用
  5. IE6无法加载CSS
  6. 104. Maximum Depth of Binary Tree
  7. USACO Section 2.4: Fractions to Decimals
  8. IE9 表格错位bug
  9. 2015年10月22日CSS学习笔记
  10. ural 1104 Don’t Ask Woman about Her Age
  11. 06JS高级创建对象使用原型共享对象方法
  12. ASP.NET Core: Getting Started with ASP.NET MVC Core
  13. C# Async/await 异步多线程编程
  14. css设置兼容的透明样式
  15. Android 导入v7包常见错误,以及项目引用v7包错误解决
  16. Java 冒泡排序法
  17. hibernate12--缓存
  18. 标准时间转YYYY-MMM-DD
  19. Struts2中.properties文件放置路径(classpath)
  20. 使用sqlalchemy用orm方式写pipeline将scrapy item快速存入 MySQL

热门文章

  1. Hadoop(6)-HDFS的shell操作
  2. python中 列表常用的操作
  3. 什么是mysql数据库安全 简单又通俗的mysql库安全简介
  4. HyperLedger Fabric 1.4 超级账本项目(5.4)
  5. SEARCH(文字の検索)
  6. python2.7入门---字典(Dictionary)
  7. 使用localStorage,sessionStorage,cookie等存储
  8. js 邮箱和手机号码验证
  9. 责任链模式的使用-Netty ChannelPipeline和Mina IoFilterChain分析
  10. 如何从海量IP中提取访问最多的10个IP