2019 计蒜之道 初赛 第四场题解

 A腾讯益智小游戏-矩阵计数

总共(n*m)!

列固定,交换行n!

行固定,交换列m!

一种形式会重复m!*n!

答案是(n*m)!/(n!*m!)

#include <cstdio>
#include <iostream>

using namespace std;

typedef long long LL;
const LL mod = 998244353; 

LL F(LL x) {
   LL ans = 1;
   for (LL i = 1; i <= x; i++) ans = (ans*i)%mod;
   return ans;
}

LL inv(LL x) {
   LL b = mod-2,ans = 1;
   while(b) {
      if (b&1) ans = (ans*x)%mod;
      x = x*x%mod;
      b>>=1;
   }
   return ans;
}

int main() {
   LL n,m;
   cin >> n >> m;
   cout << (F(n*m)%mod*inv(F(n)%mod)%mod*inv(F(m)))%mod;
   return 0;
}

 B. 腾讯益智小游戏—矩形面积交(简单)

n^2枚举

#include <cstdio>
#include <iostream>

using namespace std;

struct Data {
   int x1,x2,y1,y2;
   void in() {
      scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
   }
}a[6000];

int calc(Data a,Data b) {
   return max((min(a.x2,b.x2)-max(a.x1,b.x1)),0) * max((min(a.y2,b.y2)-max(a.y1,b.y1)),0);
}

void work() {
   int n; scanf("%d",&n);
   for (int i = 1; i <= n; i++) a[i].in();
   for (int i = 1; i <= n; i++) {
      int sum = 0;
      long long are = 0,tp;
      for (int j = 1; j <= n; j++) {
         if (j == i) continue;
         tp = calc(a[i],a[j]);
         if(tp > 0) {
            sum++;
            are += tp;
         }
         //cout << i << " " <<j <<" "<<tp<<"\n";
      }
      printf("%d %lld\n",sum,are);
   }
}

int main() {
   int T;
   scanf("%d",&T);
   while(T--) {
      work();
   }
   return 0;
}

留坑

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值