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\n", dp[now][n][m]);
    }

   //cout << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";

    return 0;
}

  

posted @ 2015-10-28 20:58  Running_Time  阅读(220)  评论(0编辑  收藏  举报