【TCO 2013 WildCard】SemiMultiple
来源:互联网 发布:网络覆盖解决方案 编辑:程序博客网 时间:2024/05/21 20:25
Description
定义一个非负数
问有多少个
Difficulty
MainAlgorithm
容斥
DP
Complexity
Solution
比较难……
我们肯定是要对每个余数分别讨论的,可以用
这样就能发现只有余数
但是也有不合法的,当且仅当应该减去
对于每个模数都去DP这个不合法的是
我们发现,当
当
那么我们只需要解决
我们先将
实际上,当
然后一个非常混乱的
我的做法稍有不同。
最后对于奇数部分,我们先DP出所有方案,为了减去不合法的,我们应当将DP反向倒退,由于此DP的特殊性,这一步相当于解一个方程,这个方程十分好解,于是就完成了。。
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>#define Rep(i, x, y) for (int i = x; i <= y; i ++)#define Dwn(i, x, y) for (int i = x; i >= y; i --)#define RepE(i, x) for(int i = pos[x]; i; i = g[i].nex)using namespace std;typedef long long LL;const int N = 2005, mod = 1000000007, p2 = (mod + 1) >> 1;LL p0, ans, f[N][N], h[N], g[N];int d[N], n, m; bool vis[N];class SemiMultiple {public:void Find(int x, int y) {while (x --) {memset (vis, 0, sizeof(vis));Rep(i, 0, m - 1) if (!vis[i]) {LL sum = 0;for (int j = i; !vis[j]; j = (j + y) % m) {(sum += h[j]) %= mod, vis[j] = 1;} sum = sum * p2 % mod;bool fl = 0; int j = i;do {if (fl) sum = (sum - h[j] + mod) % mod;fl ^= 1; j = (j + y) % m;} while (j != i);// h[m+i-y] = sum;j = i; do {h[j] = (h[j] - sum + mod) % mod; sum = h[j]; j = (j + y) % m;} while (j != i);}}}int count(int n1, int m1) {n = n1, m = m1;while (n && m % 2 == 0) m /= 2, p0 ++, n --;int r = 1; f[0][0] = 1;Rep(i, 1, n) {d[r] ++;Rep(j, 0, m - 1) f[i][j] = f[i - 1][j];Rep(j, 0, m - 1) (f[i][(j + r) % m] += f[i - 1][j]) %= mod;r = r * 2 % m;} // f[i][j] choose any of them mod m == jans = p0 * f[n][0] % mod;Rep(i, 1, m - 1) if (d[i] || d[m - i]) {// int x = d[i];(ans += f[n][i]) %= mod;Rep(j, 0, m - 1) h[j] = f[n][j];Find(d[i], i), Find(d[m - i], m - i);Rep(t0, 1, d[m - i]) {Rep(j, 0, m - 1) g[(j + m - i) % m] = h[j];Rep(j, 0, m - 1) h[j] = g[j];}ans = (ans - h[i] + mod) % mod;}return ans;}};
0 0
- 【TCO 2013 WildCard】SemiMultiple
- 【TCO 2012】WildCard SemiMultiple 区间DP
- 2013 TCO round2B EllysFigurines
- 【TCO 2013】Litpanels
- TCO 2013 Round 1A
- 【TCO 2013 3A】TrichyInequality
- TCO 2013 round 1C TheKnights
- wildcard
- Wildcard
- wildcard
- 2013 TCO Algorithm Round 2B - Division I, Level Two ScotlandYard
- TCO(总所有成本)
- TCO round 3A
- TCO 2015 2D
- TCO 2016 R1C
- TCO/IP 理解 2
- TCO之旅
- 降低TCO的五个途径
- C#为对话框form添加圆弧拐角
- uvalive 4671 - K-neighbor substrings 快速傅利叶变换
- JavaWeb学习笔记之数据库连接
- 听德国高校崛起之史,唤学者治学兴邦之思——《德国大学现代化》听与思
- Android环境搭建
- 【TCO 2013 WildCard】SemiMultiple
- html与css笔记
- Linux内核裁剪的具体步骤 http://blog.chinaunix.net/uid-10429687-id-3977273.html
- c的free和c++的delete的区别
- 如何完善链接
- PAT(甲级)1040
- C#学习笔记(五)
- Java求二叉树的最大路径和
- HDU 4554 叛逆的小明(西山居挑战赛)