zoukankan      html  css  js  c++  java
  • DP(优化) UVALive 6073 Math Magic

    /************************************************
    * Author        :Running_Time
    * Created Time  :2015/10/28 星期三 20:20:09
    * File Name     :H.cpp
     ************************************************/
    
    #include <cstdio>
    #include <algorithm>
    #include <iostream>
    #include <sstream>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <vector>
    #include <queue>
    #include <deque>
    #include <stack>
    #include <list>
    #include <map>
    #include <set>
    #include <bitset>
    #include <cstdlib>
    #include <ctime>
    using namespace std;
    
    #define lson l, mid, rt << 1
    #define rson mid + 1, r, rt << 1 | 1
    typedef long long ll;
    const int N = 1e3 + 10;
    const int M = 1e2 + 10;
    const int INF = 0x3f3f3f3f;
    const int MOD = 1e9 + 7;
    const double EPS = 1e-10;
    const double PI = acos (-1.0);
    int dp[2][N][N];
    int lcm[N][N];
    int vec[N];
    
    int GCD(int a, int b)   {
        return b ? GCD (b, a % b) : a;
    }
    
    void init(void) {
        for (int i=1; i<=1000; ++i) {
            for (int j=1; j<=1000; ++j) {
                lcm[i][j] = i * j / GCD (i, j);
            }
        }
    }
    
    inline void add(int &x, int y)   {
        x += y;
        if (x > MOD)    x -= MOD;
    }
    
    int main(void)    {
        init ();
        int n, m, k;
        while (scanf ("%d%d%d", &n, &m, &k) == 3)   {
            int t = 0;
            for (int i=1; i<=m; ++i)    {
                if (m % i == 0) vec[t++] = i;
            }
            int now = 0;
            for (int i=0; i<=n; ++i)    {
                for (int j=0; j<t; ++j) {
                    dp[now][i][vec[j]] = 0;
                }
            }
            dp[now][0][1] = 1;
            for (int l=1; l<=k; ++l)    {
                now ^= 1;
                for (int i=0; i<=n; ++i)    {
                    for (int j=0; j<t; ++j) {
                        dp[now][i][vec[j]] = 0;
                    }
                }
                for (int i=l-1; i<=n; ++i)  {
                    for (int j=0; j<t; ++j) {
                        if (dp[now^1][i][vec[j]] == 0)   continue;
                        for (int p=0; p<t; ++p) {
                            int x = i + vec[p];
                            int y = lcm[vec[j]][vec[p]];
                            if (x > n || m % y != 0)    continue;
                            dp[now][x][y] = (dp[now][x][y] + dp[now^1][i][vec[j]]) % MOD;
                        }
                    }
                }
            }
            printf ("%d
    ", dp[now][n][m]);
        }
    
       //cout << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.
    ";
    
        return 0;
    }
    

      

    编译人生,运行世界!
  • 相关阅读:
    【沟通的艺术】你能勾住你的听众么?
    java环境变量配置
    20140613故障处理纪要
    FBReaderJ源代码编译配置
    怎样加入� android private libraries 中的包的源码
    petshop4.0 具体解释之中的一个(系统架构设计)
    java推断字符串是否为乱码
    php递归无限极分类
    SIP入门(二):建立SIPserver
    线程间的通信
  • 原文地址:https://www.cnblogs.com/Running-Time/p/4918649.html
Copyright © 2011-2022 走看看