DP(优化) UVALive 6073 Math Magic
生活随笔
收集整理的這篇文章主要介紹了
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; }
轉載于:https://www.cnblogs.com/Running-Time/p/4918649.html
總結
以上是生活随笔為你收集整理的DP(优化) UVALive 6073 Math Magic的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 14:IO之字符字节流
- 下一篇: 192.168.16.1路由器地址是什么