[关闭]
@11101001 2018-07-09T09:12:50.000000Z 字数 1387 阅读 885

CodeForces - 997C Sky Full of Stars

组合数学


题目链接

CodeForces - 997C Sky Full of Stars

题解

表示至少有i行j列一种颜色的方案数
可以发现,当ij有相交时颜色只能为一种
那么对于
否则
可以得到一种很显然的容斥方法
对于第一种情况单独算,复杂度
对于第二个式子,容斥是的,推式子

换元
原式



对于后面那部分二项式因式分解

复杂变成了

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. const int maxn = 1000007;
  5. const int mod = 998244353;
  6. int n,fac[maxn],inv[maxn];
  7. int fstpow(int x,int y) {
  8. x %= mod;
  9. int ret = 1;
  10. for(; y; y >>= 1,x = 1ll * x * x % mod)
  11. if(y & 1) ret = 1ll * ret * x % mod;
  12. return ret;
  13. }
  14. int calc(int x,int y) {
  15. return 1ll * ((fac[x] * inv[y]) % mod) * (inv[x - y]) % mod;
  16. }
  17. void get_inv() {
  18. fac[0] = 1,inv[0] = 1;
  19. for(int i = 1;i <= n;i++) {
  20. fac[i] = 1ll * fac[i - 1] * i % mod;
  21. inv[i] = fstpow(fac[i],mod - 2);
  22. }
  23. }
  24. main() {
  25. scanf("%I64d",&n);
  26. get_inv();
  27. int ans1 = 0;
  28. for(int a,b,i = 1;i <= n;i++) {
  29. a = 1ll * calc(n,i) * fstpow(-1,i + 1) % mod;
  30. b = fstpow(3, (1ll * n * (n - i) + i) % (mod - 1));
  31. ans1 = (ans1 + (1ll * a * b % mod)) % mod;
  32. }
  33. ans1 = 2 * ans1 % mod;
  34. int ans2 = 0;
  35. for(int t,b,a,i = 0;i < n;i++) {
  36. a = 1ll * calc(n,i) * fstpow(-1,i + 1) % mod;
  37. t = mod - fstpow(3,i);
  38. b = (fstpow(t + 1,n) + mod - fstpow(t,n)) % mod;
  39. ans2 = (ans2 + (1ll * a * b) % mod) % mod;
  40. }
  41. //int tmp =
  42. printf("%I64d\n",(((ans1 + 1ll * ans2 * 3) % mod) + mod) % mod);
  43. return 0;
  44. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注