zoj 3644(关于最小公倍数的DP)
来源:互联网 发布:影响网络成瘾的因素 编辑:程序博客网 时间:2024/06/07 16:03
这个题目必须得记录一下,经典。
dp【i】【j】 i表示现在在哪个点,j表示现在是第几个约数,记忆化搜索即可,做了一些题之后,发现这是个经典的设置状态方法。
#include<stdio.h>#include<string.h>#include<math.h>#include<map>#define MOD 1000000007#define Max(a,b) ((a)>(b)?(a):(b))#define Min(a,b) ((a)<(b)?(a):(b))#define LL long longusing namespace std;const int maxn = 20005;struct edge{ int u,v,next;}e[maxn];map<LL,int> mp;int n,m,K,dp[2005][1005];int head[2005],tot,get[2005];void add_edge(int u,int v);int dfs(int now,LL x);void init();LL gcd(LL a,LL b){ return b==0?a:gcd(b,a%b);}//最大公约数LL lcm(LL a,LL b){ return a/gcd(a,b)*b;}//最小公倍数int main(){ int i; while(scanf("%d%d%d",&n,&m,&K) != EOF) { memset(dp,-1,sizeof(dp)); memset(head,-1,sizeof(head)); tot = 0; for(i = 0;i < m;i ++) { int u,v; scanf("%d%d",&u,&v); add_edge(u,v); } for(i = 1;i <= n;i ++) scanf("%d",&get[i]); init(); if(mp.find(get[1]) == mp.end()) { printf("0\n"); continue; } printf("%d\n",dfs(1,get[1])); } return 0;}void add_edge(int u,int v){ e[tot].u = u,e[tot].v = v; e[tot].next = head[u],head[u] = tot ++;}void init(){ int i,j,cnt = 0; mp.clear(); for(i = 1;i <= sqrt(K);i ++) { if(K % i) continue; mp[i] = cnt ++; mp[K / i] = cnt ++; }}int dfs(int now,LL x){ if(dp[now][mp[x]] != -1) return dp[now][mp[x]]; if(now == n) { if(x == K) return dp[now][mp[x]] = 1; else return dp[now][mp[x]] = 0; } int i,sum = 0; map<LL,int>:: iterator it; for(i = head[now];i != -1;i = e[i].next) { int v = e[i].v; LL y = lcm(x,get[v]); if(y == x) continue; it = mp.find(y); if(it == mp.end()) continue; sum += dfs(v,y); sum %= MOD; } return dp[now][mp[x]] = sum;}
- zoj 3644(关于最小公倍数的DP)
- zoj 3662 dp (递推k个数 组成的和为n,最小公倍数为m的所有可能)
- ZOJ 3662 Math Magic(构造K个和为N且最小公倍数为M的正整数的方案数/dp)
- 求最小公倍数------关于对最小公倍数的规范思考
- 关于求连续区间的最小公倍数
- zoj 3344 //组合数学那种的DP
- zoj 2834 蛮有意思的树形DP
- zoj 3211 砍树 有顺序的dp
- zoj 3527 带环的树形DP
- ZOJ 3644 Kitty's Game(DP)
- zoj 3644(dp + 记忆化搜索)
- ZOJ 3644 Kitty's Game(DP)
- ZOJ 3644 Kitty's Game (DP)
- 关于求最大公约数和最小公倍数的的算法
- 关于最大公约数与最小公倍数的几种题型
- 关于如何求分数的最小公倍数和最大公约数
- 关于ZOJ和POJ的题型分类
- zoj 1149 双向dp
- 中兴移动的笔试题,字符串的移动
- C/C++编译过程理解
- 谈谈你对面向对象编程的认识(小米 2012/9/11)
- 《计算机组成与设计》笔记(part1)(自学加菜鸟,水平非常有限,不喜勿喷,谢咯)
- Android APK反编译详解(附图)
- zoj 3644(关于最小公倍数的DP)
- 你的SQL Server日志增长参数设置的正确吗?
- 《宝岛双雄》观后感
- 动态继承
- 有符号数转换中"符号位扩展"
- 如何购买赛门铁克的代码数字签名?
- myeclipse9对导入的jquery.js文件报错——解决办法
- 修改PPT的模版
- matlab——setdiff