ZOJ 3644 Kitty's Game(DP)
2012-10-02 22:20
423 查看
转载请注明出处,谢谢/article/2566293.html
by---cxlove
题目:给出一个有向图,从1到n,每个结点有个权值,每走一步,分值为结点权值的LCM,而且每一步的LCM都要有变化,问到达N的时候分值恰好为K的路径有多少条
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4834
练习的时候,把K质因子分解,最多只有8个,也就是说路径最多8个结点,傻叉了,连LCM都搞错,把LCM(4,5)=LCM(2,5)了,果断跪了
其实不是考虑K的质因子,每次LCM的变化都为K的约数,所以求出K的所有约数,然后map离散一下
K最大为10^6,约数数目最多为2*sqrt(K);
dp[i][j]表示到达第i个结点的时候,当前为状态j的时候的路径数,记忆化搜索
by---cxlove
题目:给出一个有向图,从1到n,每个结点有个权值,每走一步,分值为结点权值的LCM,而且每一步的LCM都要有变化,问到达N的时候分值恰好为K的路径有多少条
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4834
练习的时候,把K质因子分解,最多只有8个,也就是说路径最多8个结点,傻叉了,连LCM都搞错,把LCM(4,5)=LCM(2,5)了,果断跪了
其实不是考虑K的质因子,每次LCM的变化都为K的约数,所以求出K的所有约数,然后map离散一下
K最大为10^6,约数数目最多为2*sqrt(K);
dp[i][j]表示到达第i个结点的时候,当前为状态j的时候的路径数,记忆化搜索
#include<iostream> #include<cstdio> #include<map> #include<cstring> #include<cmath> #include<vector> #include<algorithm> #include<set> #include<string> #include<queue> #define inf 1<<29 #define M 200005 #define N 2005 #define maxn 300005 #define Min(a,b) ((a)<(b)?(a):(b)) #define Max(a,b) ((a)>(b)?(a):(b)) #define pb(a) push_back(a) #define mem(a,b) memset(a,b,sizeof(a)) #define LL long long #define MOD 1000000007 #define lson step<<1 #define rson step<<1|1 using namespace std; struct Node { int v,next; }edge[M]; int n,m,k; int start ,cnt=0,tot=0; int val ,dp ; map<LL,int>fac; void addedge(int u,int v) { edge[cnt].v=v; edge[cnt].next=start[u]; start[u]=cnt++; } 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; } LL dfs(int u,LL x) { if(dp[u][fac[x]]!=-1) return dp[u][fac[x]]; if(u==n) return x==k; dp[u][fac[x]]=0; for(int i=start[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if(k%val[v]) continue; LL tmp=lcm(x,val[v]); if(tmp>k||tmp==x) continue; dp[u][fac[x]]=(dp[u][fac[x]]+dfs(v,tmp))%MOD; } return dp[u][fac[x]]; } int main() { while(scanf("%d%d%d",&n,&m,&k)!=EOF) { fac.clear(); mem(start,-1);cnt=0;tot=0; for(int i=1;i*i<=k;i++) { if(k%i==0) { fac[(LL)i]=++tot; if(k/i!=i) fac[(LL)k/i]=++tot; } } while(m--) { int u,v; scanf("%d%d",&u,&v); addedge(u,v); } for(int i=1;i<=n;i++) scanf("%d",&val[i]); if(fac.find(val[1])==fac.end()) printf("0\n"); else { mem(dp,-1); printf("%lld\n",dfs(1,val[1])); } } return 0; }
相关文章推荐
- ZOJ 3644 Kitty's Game(状态简化 & DP)
- ZOJ 3644 Kitty's Game(DP)
- ZOJ 3644 Kitty's Game(记忆化搜索+剪枝)
- ZOJ 3644 Kitty's Game
- ZOJ 3644 Kitty's Game (DP)
- ZOJ 3644 Kitty's Game (图上DP 约数)
- uva 10404 - Bachet's Game(DP)
- ZOJ 3380 Patchouli's Spell Cards(DP,大数)
- Penney's game (hdu 5169, zoj 3274)
- zoj 1108 FatMouse's Speed(DP)
- ZOJ 3644 Kitty's Game(数论+DP)
- zoj 1913 Euclid's Game
- Kitty's Game zoj3644(dp+stl)
- ZOJ 3380 Patchouli's Spell Cards (概率dp)
- poj 2411 && zoj 1100 Mondriaan's Dream ———状态压缩dp
- ZOJ 3380 Patchouli's Spell Cards [基础DP+大数]
- UVa 10404 Bachet's Game (DP&博弈)
- UVa 10404 Bachet's Game(DP)
- uva 10404 Bachet's Game(dp 博弈)
- ZOJ 3380 Patchouli's Spell Cards( 概率DP)