题目链接: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:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <map>
 5 #define MOD 1000000007
 6
 7 using namespace std;
 8
 9 int x,y;
10 map<int,int> mp;
11
12 long long quick_pow(long long n,long long k)
13 {
14     long long ans=1;
15     while(k>0)
16     {
17         if(k&1) ans=(ans*n)%MOD;
18         n=n*n%MOD;
19         k>>=1;
20     }
21     return ans;
22 }
23
24 long long dfs(int i)
25 {
26     if(i==1) return 1;
27     if(mp.count(i)) return mp[i];
28     long long ans=quick_pow(2,i-1);
29     for(int j=2;j*j<=i;j++)
30     {
31         if(i%j==0)
32         {
33             ans=((ans-dfs(j))%MOD+MOD)%MOD;
34             if(i/j!=j) ans=((ans-dfs(i/j))%MOD+MOD)%MOD;
35         }
36     }
37     ans=((ans-1)%MOD+MOD)%MOD;
38     return mp[i]=ans;
39 }
40
41 int main()
42 {
43     cin>>x>>y;
44     cout<<(y%x==0 ? dfs(y/x) : 0)<<endl;
45 }

转载于:https://www.cnblogs.com/Leohh/p/8464069.html

Codeforces 900D Unusual Sequences:记忆化搜索相关推荐

  1. codeforces 900D. Unusual Sequences(莫比乌斯反演)

    900D. Unusual Sequences(莫比乌斯反演) 题目链接:传送门 题意: 给出 xxx 和 yyy ,求序列形如 a1,a2..ana_1,a_2..a_na1​,a2​..an​ 满 ...

  2. Codeforces Round #336 (Div. 2) D. Zuma 记忆化搜索

    D. Zuma 题目连接: http://www.codeforces.com/contest/608/problem/D Description Genos recently installed t ...

  3. Codeforces Round #406 (Div. 1) A. Berzerk 记忆化搜索

    A. Berzerk 题目连接: http://codeforces.com/contest/786/problem/A Description Rick and Morty are playing ...

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

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

  5. 思维dp ---- Codeforces Round #711 (Div. 2) - C. Planar Reflections[dp/记忆化搜索]

    题目链接 题目大意: 就是给你n个平面和一个寿命为k的衰变粒子.开始粒子从左向右飞行,粒子每经过一个平面就会产生一个副本粒子,这个副本粒子比原粒子的寿命少1,即为k-1,并且飞行方向是原粒子的反方向. ...

  6. CodeForces - 1285D Dr. Evil Underscores(记忆化搜索+字典树)

    题目链接:点击查看 题目大意:给出n个数字,现在要求出一个X,使得X与n个数字单独异或之后的最大值,输出这个最大值的最小值 题目分析:最大值的最小值,差点就以为是字典树+二分了,因为没有单调性然后就无 ...

  7. Gargari and Permutations CodeForces - 463D(建图+记忆化搜索)

    Gargari got bored to play with the bishops and now, after solving the problem about them, he is tryi ...

  8. Educational Codeforces Round 52: D. Three Pieces(记忆化搜索)

    D. Three Pieces 题意: 给你一n*n的矩阵,每个格子都有一个数字且所有数字构成一个1~n²的全排列,一开始你的棋子在编号为1的点上,之后你要依次到达编号为2的点.编号为3的点-- 编号 ...

  9. Codeforces 1293 E. Xenon‘s Attack on the Gangs —— 树上记忆化搜索,单点加改成区间加,有丶东西

    This way 题意: 现在有一棵大小为n的树,你要往边上放0~n-2这n-1个数,定义mex(u,v)表示u到v路径上的第一个未出现的自然数,定义S 问你S最大是多少. 题解: 我感觉这道题绝不止 ...

最新文章

  1. 大牛讲堂 | 邬书哲:物体检测算法的革新与传承
  2. 全球及中国甜菊糖苏打水行业营销模式与盈利前景调研报告2022版
  3. 阿里疯传!Python+Tableau+Excel数分教程(附内部资源)
  4. java发送小程序模板消息,记录_小程序发送模板消息
  5. python学习实例(4)
  6. python 类定义 垃圾_什么是python对象摧毁?python中的对象摧毁(垃圾回收)机制是什么?...
  7. Hadoop下水环境模拟集群运算模式
  8. 十大经典排序算法系列
  9. 2021-2025年中国冲击式粉碎机装置行业市场供需与战略研究报告
  10. SLAM_视觉SLAM中的一种单目稠密建图方法
  11. iOS UILabel字体设置
  12. 华为ENSP远程登录
  13. matlab调用pspice结果,使PSpice输出数据文件可以导入到MATLAB中绘制图形.pdf
  14. 前后端分离 -- 深入浅出 Spring Boot + Vue 实现工程项目进度管理系统 Vue不过如此~
  15. 用java代码怎样做pos结算_Java Tile.Pos方法代码示例
  16. elasticsearch 支持拼音检索
  17. Visual Studio快速配置增加文件版权声明
  18. C语言 计算个人所得税
  19. java 调用autoit_java和autoit连接
  20. C/C++ MessageBox() 弹窗的用法

热门文章

  1. SQL Server中灾难时备份结尾日志(Tail of log)的两种方法
  2. arcengine 加载地图不显示_地图建筑建模制作与输出
  3. mysql更新索引不影响业务_mysql索引更新要多久
  4. 在mysql查询库和表_查询mysql 库和表占的大小
  5. python井字棋_用Python做一个井字棋小游戏
  6. iis+php解析漏洞修复,IIS7.0畸形解析漏洞通杀0day
  7. 【C++】多线程互斥锁、条件变量
  8. linux at shell,shell 用at命令来计划执行作业
  9. cmd连接oracle_Oracle -PLSQLDeveloper 13 数据库连接
  10. 解决Android Studio中DDMS缺少File Explore视窗的方法