题目链接:http://codeforces.com/problemset/problem/900/D

题意:

  给定x,y,问你有多少个数列a满足gcd(a[i]) = x 且 ∑(a[i]) = y。

题解:

  由于gcd(a[i]) = x,所以y一定是x的倍数,否则无解。

  那么原题就等价于:问你有多少个数列a满足gcd(a[i]) = 1 且 ∑(a[i]) = y/x。

  设f(k)为gcd(a[i]) = 1 且 ∑(a[i]) = k时的答案。

  只满足条件∑(a[i]) = k的数列共有2^(k-1)种(隔板法)

  然后要从中去掉gcd不为1的数列。

  每个和为k且gcd不为1的数列a1,对应着一个和为k的因数且gcd为1的数列a2。

  因为a1可以由a2整体放大而来。

  那么也就是f(k) = 2^(k-1) - ∑ f(p),其中p为k的因数(p != k)。

  搜索 + map记忆化即可。

  由于需要用到的f(k),k均为y/x的因数,最多sqrt(y/x)个。

  加上map的log复杂度,所以总复杂度为O(sqrt(n)*log(n))。

AC Code:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <map>
#define MOD 1000000007 using namespace std; int x,y;
map<int,int> mp; long long quick_pow(long long n,long long k)
{
long long ans=;
while(k>)
{
if(k&) ans=(ans*n)%MOD;
n=n*n%MOD;
k>>=;
}
return ans;
} long long dfs(int i)
{
if(i==) return ;
if(mp.count(i)) return mp[i];
long long ans=quick_pow(,i-);
for(int j=;j*j<=i;j++)
{
if(i%j==)
{
ans=((ans-dfs(j))%MOD+MOD)%MOD;
if(i/j!=j) ans=((ans-dfs(i/j))%MOD+MOD)%MOD;
}
}
ans=((ans-)%MOD+MOD)%MOD;
return mp[i]=ans;
} int main()
{
cin>>x>>y;
cout<<(y%x== ? dfs(y/x) : )<<endl;
}

Codeforces 900D Unusual Sequences:记忆化搜索的更多相关文章

  1. Codeforces 900D Unusual Sequences 容斥原理

    题目链接:900D  Unusual Sequences 题意: 给出两个数N,M.让你求数列(和为M,gcd为N)的个数. 题解: 首先,比较容易发现的是M%N如果不为零,那么一定不能构成这样的序列 ...

  2. CodeForces 173C Spiral Maximum 记忆化搜索 滚动数组优化

    Spiral Maximum 题目连接: http://codeforces.com/problemset/problem/173/C Description Let's consider a k × ...

  3. CodeForces 398B 概率DP 记忆化搜索

    题目:http://codeforces.com/contest/398/problem/B 有点似曾相识的感觉,记忆中上次那个跟这个相似的 我是用了 暴力搜索过掉的,今天这个肯定不行了,dp方程想了 ...

  4. CodeForces 132C Logo Turtle (记忆化搜索)

    Description A lot of people associate Logo programming language with turtle graphics. In this case t ...

  5. CodeForces 918D MADMAX(博弈+记忆化搜索)

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  6. Codeforces 667C Reberland Linguistics 记忆化搜索

    链接 Codeforces 667C Reberland Linguistics 题意 给你一个字符串,除去前5个字符串后,使剩下的串有长度为2或3的词根组成,相邻的词根不能重复.找到所有的词根 思路 ...

  7. CodeForces 900D Unusual Sequences

    题目链接: https://codeforces.com/contest/900/problem/D 题意 假设有distinct 正整数序列{a1,a2,,,an},满足gcd(a1, a2, .. ...

  8. Codeforces #564div2 E1(记忆化搜索)

    虽然不是正解但毕竟自己做出来了还是记下来吧- 对每个人分别dfs得到其期望,某两维的组合情况有限所以Hash一下避免了MLE. #include <cstdio> #include < ...

  9. Codeforces Gym 100231G Voracious Steve 记忆化搜索

    Voracious Steve 题目连接: http://codeforces.com/gym/100231/attachments Description 有两个人在玩一个游戏 有一个盆子里面有n个 ...

随机推荐

  1. Win7 64bit+Anaconda(3-5.0.1,Python3.6)+Pycharm(community-2017.3.3)+OpenCV(python‑3.4.0‑cp36‑cp36m)(转载)

    Anaconda(3-5.0.1,Python3.6)下载链接:https://pan.baidu.com/s/1bqFwLMB 密码:37ih Pycharm(community-2017.3.3) ...

  2. Modern.IE,创建现代网站的给力开发工具!

    Modern.IE是微软推出的用来帮助开发者创建现代网站的基本开发工具.作为Web攻城师,最头疼的问题莫过于浏览器兼容性测试,各种类型浏览器,各种版本的浏览器,还有各种头疼的前缀等等.Modern.I ...

  3. php 在linux 用fopen() 函数打开,file_get_contents(),fread()函数 读取 另外一台服务器映射过来的文件 总是返回false,null的情况。

    php 在linux 用fopen() 函数打开,fread()函数 读取  另外一台服务器映射过来的文件 总是返回false,null的情况. #获取平台类型   $type='android';  ...

  4. 解决ubuntukylin下各种终端字母重叠的方案

    ubuntukylin14.04什么都挺好定符合中国人的使用习惯的,可是就是终端字母重叠的问题特别严重;(事实上ubuntu14.04也存在这个问题) 导致非常多非常好用的终端都使用不了,像guake ...

  5. Mac下python连接mysql数据库

    一.下载Mysql官方connector驱动 地址:https://dev.mysql.com/downloads/connector/python/ 根据提示安装.dmg文件即可. 二.验证是否安装 ...

  6. java 中 集合类相关问题

    1,Java中Collection和Collections的差别 java.util.Collection 是一个集合接口.它提供了对集合对象进行基本操作的通用接口方法. Collection接口在J ...

  7. 线性同余方程组模板( x=r0(mod m0) )

    #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm& ...

  8. Intersection(计算几何)

    Intersection Time Limit: 4000/4000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others)To ...

  9. 反应器模式 vs 生产者消费者模式

    相似点: 从结构上,反应器模式有点类似生产者消费者模式,即有一个或多个生产者将事件放入一个Queue中,而一个或多个消费者主动的从这个Queue中Poll事件来处理: 不同点: Reactor模式则并 ...

  10. Python菜鸟之路:Python基础-线程池注释

    import sys import threading import Queue import traceback # 定义一些Exception,用于自定义异常处理 class NoResultsP ...