Codeforces 900D Unusual Sequences:记忆化搜索
题目链接: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:记忆化搜索相关推荐
- codeforces 900D. Unusual Sequences(莫比乌斯反演)
900D. Unusual Sequences(莫比乌斯反演) 题目链接:传送门 题意: 给出 xxx 和 yyy ,求序列形如 a1,a2..ana_1,a_2..a_na1,a2..an 满 ...
- Codeforces Round #336 (Div. 2) D. Zuma 记忆化搜索
D. Zuma 题目连接: http://www.codeforces.com/contest/608/problem/D Description Genos recently installed t ...
- Codeforces Round #406 (Div. 1) A. Berzerk 记忆化搜索
A. Berzerk 题目连接: http://codeforces.com/contest/786/problem/A Description Rick and Morty are playing ...
- Codeforces Gym 100231G Voracious Steve 记忆化搜索
Voracious Steve 题目连接: http://codeforces.com/gym/100231/attachments Description 有两个人在玩一个游戏 有一个盆子里面有n个 ...
- 思维dp ---- Codeforces Round #711 (Div. 2) - C. Planar Reflections[dp/记忆化搜索]
题目链接 题目大意: 就是给你n个平面和一个寿命为k的衰变粒子.开始粒子从左向右飞行,粒子每经过一个平面就会产生一个副本粒子,这个副本粒子比原粒子的寿命少1,即为k-1,并且飞行方向是原粒子的反方向. ...
- CodeForces - 1285D Dr. Evil Underscores(记忆化搜索+字典树)
题目链接:点击查看 题目大意:给出n个数字,现在要求出一个X,使得X与n个数字单独异或之后的最大值,输出这个最大值的最小值 题目分析:最大值的最小值,差点就以为是字典树+二分了,因为没有单调性然后就无 ...
- Gargari and Permutations CodeForces - 463D(建图+记忆化搜索)
Gargari got bored to play with the bishops and now, after solving the problem about them, he is tryi ...
- Educational Codeforces Round 52: D. Three Pieces(记忆化搜索)
D. Three Pieces 题意: 给你一n*n的矩阵,每个格子都有一个数字且所有数字构成一个1~n²的全排列,一开始你的棋子在编号为1的点上,之后你要依次到达编号为2的点.编号为3的点-- 编号 ...
- Codeforces 1293 E. Xenon‘s Attack on the Gangs —— 树上记忆化搜索,单点加改成区间加,有丶东西
This way 题意: 现在有一棵大小为n的树,你要往边上放0~n-2这n-1个数,定义mex(u,v)表示u到v路径上的第一个未出现的自然数,定义S 问你S最大是多少. 题解: 我感觉这道题绝不止 ...
最新文章
- 大牛讲堂 | 邬书哲:物体检测算法的革新与传承
- 全球及中国甜菊糖苏打水行业营销模式与盈利前景调研报告2022版
- 阿里疯传!Python+Tableau+Excel数分教程(附内部资源)
- java发送小程序模板消息,记录_小程序发送模板消息
- python学习实例(4)
- python 类定义 垃圾_什么是python对象摧毁?python中的对象摧毁(垃圾回收)机制是什么?...
- Hadoop下水环境模拟集群运算模式
- 十大经典排序算法系列
- 2021-2025年中国冲击式粉碎机装置行业市场供需与战略研究报告
- SLAM_视觉SLAM中的一种单目稠密建图方法
- iOS UILabel字体设置
- 华为ENSP远程登录
- matlab调用pspice结果,使PSpice输出数据文件可以导入到MATLAB中绘制图形.pdf
- 前后端分离 -- 深入浅出 Spring Boot + Vue 实现工程项目进度管理系统 Vue不过如此~
- 用java代码怎样做pos结算_Java Tile.Pos方法代码示例
- elasticsearch 支持拼音检索
- Visual Studio快速配置增加文件版权声明
- C语言 计算个人所得税
- java 调用autoit_java和autoit连接
- C/C++ MessageBox() 弹窗的用法
热门文章
- SQL Server中灾难时备份结尾日志(Tail of log)的两种方法
- arcengine 加载地图不显示_地图建筑建模制作与输出
- mysql更新索引不影响业务_mysql索引更新要多久
- 在mysql查询库和表_查询mysql 库和表占的大小
- python井字棋_用Python做一个井字棋小游戏
- iis+php解析漏洞修复,IIS7.0畸形解析漏洞通杀0day
- 【C++】多线程互斥锁、条件变量
- linux at shell,shell 用at命令来计划执行作业
- cmd连接oracle_Oracle -PLSQLDeveloper 13 数据库连接
- 解决Android Studio中DDMS缺少File Explore视窗的方法