【CF900D】Unusual Sequences

题意:定义正整数序列$a_1,a_2...a_n$是合法的,当且仅当$gcd(a_1,a_2...a_n)=x$且$a_1+a_2+...+a_n=y$。给定x,y,求合法的序列总数。

x,y<=10^9。

题解:不难想到容斥,先不管gcd的限制,那么总方案数就是$2^{y-1}$。你可以理解为有y个1,除了第一个1,其余的要么加到上一个数中去,要么自己变成一个新数。

如果考虑gcd的限制呢?容斥一发即可。并且容斥系数就是我们常用的莫比乌斯函数。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
const ll P=1000000007;
int n,m,tot;
ll ans;
int p[10];
inline ll pm(ll x,ll y)
{
ll z=1;
while(y)
{
if(y&1) z=z*x%P;
x=x*x%P,y>>=1;
}
return z;
}
void dfs(int x,int y,int z)
{
if(x>tot)
{
ans=(ans+P+pm(2,n/y-1)*z%P)%P;
return ;
}
dfs(x+1,y,z),dfs(x+1,y*p[x],-z);
}
int main()
{
scanf("%d%d",&m,&n);
if(n%m)
{
puts("0");
return 0;
}
n/=m;
int i,t=n;
for(i=2;i*i<=t;i++) if(t%i==0)
{
p[++tot]=i;
while(t%i==0) t/=i;
}
if(t!=1) p[++tot]=t;
dfs(1,1,1);
printf("%I64d",ans);
return 0;
}

最新文章

  1. Shell脚本学习第二课&#183;
  2. java 初始化顺序
  3. 场景5 Performance Management
  4. xhprof学习笔记
  5. Linux学习笔记(15)shell基础之Bash基本功能
  6. C#函数式编程之缓存技术
  7. Android - 软件自动更新的实现
  8. Oracle数据库的安装详解
  9. 微信公众平台接口,asp.net实现
  10. java基础之IO篇
  11. Linux显示列出块设备
  12. Hive_1
  13. vue scrolle在tab 中使用
  14. Rpc框架dubbo-client(v2.6.3) 源码阅读(二)
  15. (转)java 层调用Jni(Ndk) 持久化c c++ 对象
  16. php调用c#的dll(转)
  17. docker 限制 容器内存 使用
  18. java查找字符串里与指定字符串相同的个数
  19. win7win8 64位汇编开发环境合集安装与设置
  20. Java 数组详解 - 用法、遍历、排序、实用API

热门文章

  1. virtualbox谨记:续....
  2. Spring的JdbcTemplate与其事务
  3. 二维码解析:使用 JavaScript 库reqrcode.js解析二维码
  4. Java开发者需要学习的移动开发编程语言
  5. linux如何通过脚本来修改用户的密码?脚本自动化修改用户密码?
  6. Tomcat------启动时报错:Failed to start component [StandardEngine[Catalina].StandardHost[localhost].
  7. Hibernate_day03讲义_使用Hibernate完成多对多的关系映射并操作
  8. 利用OpenSSL库对Socket传输进行安全加密(RSA+AES)
  9. vux 使用 font-awesome
  10. Linux ping 命令