【dp】Arrange the Schedule
2014-09-25 18:23
169 查看
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3538
题意:如题。
题解: 假如 一组数据 。。。(n1)A。。。。(n2)A。。。。(n2) 由于三部分为独立事件, 则总数为三部分相乘。 (1)(3)易求,即3^n1, 3^n3,对于 (2), 当头尾相同(如样例) 可推出 an = 2an - 1 + 3an - 2; (a1 = 0, a2 = 3) 则 an =( 3(-1)^(n - 2) + 3^n ) / 4; 当头尾不想同(如 A。。。。B)an = 2an - 1 + 3an - 2;(a1 = 1; a2 = 2) 则an = ((-1)^(n - 1) + 3^n)/4(计算是4 取逆元);
需要注意 当m = 0的数据, 以及本身相邻两个字母相同(结果为0)。
题意:如题。
题解: 假如 一组数据 。。。(n1)A。。。。(n2)A。。。。(n2) 由于三部分为独立事件, 则总数为三部分相乘。 (1)(3)易求,即3^n1, 3^n3,对于 (2), 当头尾相同(如样例) 可推出 an = 2an - 1 + 3an - 2; (a1 = 0, a2 = 3) 则 an =( 3(-1)^(n - 2) + 3^n ) / 4; 当头尾不想同(如 A。。。。B)an = 2an - 1 + 3an - 2;(a1 = 1; a2 = 2) 则an = ((-1)^(n - 1) + 3^n)/4(计算是4 取逆元);
需要注意 当m = 0的数据, 以及本身相邻两个字母相同(结果为0)。
/***Good Luck***/ #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <string> #include <algorithm> #include <stack> #include <map> #include <queue> #include <vector> #include <set> #include <functional> #include <cmath> #include <numeric> #define Zero(a) memset(a, 0, sizeof(a)) #define Neg(a) memset(a, -1, sizeof(a)) #define All(a) a.begin(), a.end() #define PB push_back #define inf 0x3f3f3f3f #define inf2 0x7fffffffffffffff #define ll long long using namespace std; //#pragma comment(linker, "/STACK:102400000,102400000") void get_val(int &a) { int value = 0, s = 1; char c; while ((c = getchar()) == ' ' || c == '\n'); if (c == '-') s = -s; else value = c - 48; while ((c = getchar()) >= '0' && c <= '9') value = value * 10 + c - 48; a = s * value; } const int maxn = 14; pair<char, int> pr[maxn]; int n, m; ll mod = 1000000007; inline ll modxp(ll a, ll b, ll mod) { ll ret = 1; ll tmp = a; while (b) { if (b & 1) ret = ret* tmp %mod; tmp = tmp * tmp % mod; b >>= 1; } return ret; } bool cmp(pair<char, int> a, pair<char, int> b) { return a.second < b.second; } int main() { //freopen("data.out", "w", stdout); //freopen("data.in", "r", stdin); //cin.sync_with_stdio(false); while (cin >> n >> m) { ll ans = 1; if (m == 0) { cout << (4 * modxp(3, n - 1, mod)) % mod << endl; continue; } for (int i = 1; i <= m; ++i) { cin >> pr[i].second >> pr[i].first; } sort(pr + 1, pr + m + 1, cmp); ans *= modxp(3, pr[1].second - 1, mod); ans *= modxp(3, n - pr[m].second, mod); ans %= mod; ll t; bool flag = false; for (int i = 2; i <= m; ++i) { if (pr[i].first == pr[i - 1].first && pr[i].second - pr[i - 1].second == 1) { cout << 0 << endl; flag = true; break; } if (pr[i].second - pr[i - 1].second == 1) continue; else { t = pr[i].second - pr[i - 1].second; if (pr[i].first == pr[i - 1].first) { ans *= ((3 * ((t & 1) ? -1 : 1) + modxp(3, t, mod)) * 250000002) % mod ; ans %= mod; } else { ans *= ((((t & 1) ? 1 : -1) + modxp(3, t, mod)) * 250000002) % mod; ans %= mod; } } } if (!flag) cout << ans << endl; } return 0; }
相关文章推荐
- ZOJ HDU 3538 Arrange the Schedule
- zoj 3538 Arrange the Schedule
- zoj 3538 Arrange the Schedule[矩阵]
- POJ 2441 Arrange the Bulls (状压DP)
- POJ 2441 Arrange the Bulls 状态压缩DP
- POJ 2441 Arrange the Bulls / 状态压缩DP
- poj 2441 Arrange the Bulls(状压DP)
- uva 11471 Arrange the Tiles (DP)
- POJ 2441 Arrange the Bulls(状态压缩DP入门)
- poj 2441 Arrange the Bulls (状压dp)
- POJ 2441 Arrange the Bulls 状压dp
- POJ 2441 Arrange the Bulls(状压DP)
- poj 2441 Arrange the Bulls(状压dp)
- ZOJ_Arrange the Schedule
- 文章标题 POJ 2441 :Arrange the Bulls(状压DP)
- POJ - 2441 Arrange the Bulls (状态压缩DP)
- POJ 2441 Arrange the Bulls 状态压缩DP
- Arrange the Bulls(poj2441)状态压缩dp
- zoj 3538 Arrange the Schedule
- poj 2441 Arrange the Bulls(状态压缩dp)