HDU 5155 Harry And Magic Box(容斥+组合数学)
2015-01-03 22:11
465 查看
先保证每行不能为0,这样首先保证了行是满足的
然后每次枚举有i列全部为0的,这样是乘上C[m][i]
那么每行剩下m - i个位置就可以01随便放,但是要去掉全0的情况,所以是2^(m - i) - 1种
然后有n行,情况就是 f(i) = (2^(m - i) - 1) ^ n
然后容斥 f(0) - f(1) + f(2) - f(3)...这样推过去
代码:
然后每次枚举有i列全部为0的,这样是乘上C[m][i]
那么每行剩下m - i个位置就可以01随便放,但是要去掉全0的情况,所以是2^(m - i) - 1种
然后有n行,情况就是 f(i) = (2^(m - i) - 1) ^ n
然后容斥 f(0) - f(1) + f(2) - f(3)...这样推过去
代码:
#include <cstdio> #include <cstring> typedef long long ll; const ll MOD = 1000000007; int n, m; ll pow_mod(ll x, int k) { x %= MOD; ll ans = 1; while (k) { if (k&1) ans = ans * x % MOD; x = x * x % MOD; k >>= 1; } return ans; } const int N = 55; ll C ; int main() { for (int i = 1; i < N; i++) { C[i][0] = C[i][i] = 1; for (int j = 1; j < i; j++) { C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % MOD; } } while (~scanf("%d%d", &n, &m)) { ll ans = 0; for (int i = 0; i <= m; i++) { if (i % 2) { ans = ((ans - pow_mod((1LL<<(m - i)) - 1LL, n) * C[m][i] % MOD) % MOD + MOD) % MOD; } else ans = (ans + pow_mod((1LL<<(m - i)) - 1LL, n) * C[m][i] % MOD) % MOD; } printf("%lld\n", ans); } return 0; }
相关文章推荐
- hdu 5155 Harry And Magic Box(递推)
- HDU 5155 Harry And Magic Box --DP
- hdu 5155 Harry And Magic Box
- HDU 5155 Harry And Magic Box(组合+容斥)
- HDU 5155 Harry And Magic Box dp
- HDU 5155 Harry And Magic Box --DP
- HDU-5155 Harry And Magic Box(DP,组合数)
- HDU - 5155 Harry And Magic Box
- Hdu 5155 Harry And Magic Box
- hdu 5155 Harry And Magic Box BC#25比赛1002
- HDU 5155 Harry And Magic Box( DP )
- 【HDU】5155 Harry And Magic Box 【容斥原理】
- 【CUGBACM15级BC第25场 B】hdu 5155 Harry And Magic Box
- hdu 5155 Harry And Magic Box(DP)
- HDU 5155 Harry And Magic Box
- 【HDOJ】5155 Harry And Magic Box
- [HDOJ 5155] Harry And Magic Box
- HDOJ 5155 Harry And Magic Box DP
- BestCoder Round #25 1002 Harry And Magic Box [dp]
- HDU 5157 Harry and magic string(Manacher)