BC-【Kblack loves flag】

来源:互联网 发布:手感好的键盘 知乎 编辑:程序博客网 时间:2024/06/11 17:02

Kblack loves flag

 
 Accepts: 422
 
 Submissions: 765
 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 65536/65536 K (Java/Others)
问题描述
kblack喜欢旗帜(flag),他的口袋里有无穷无尽的旗帜。某天,kblack得到了一个n*mnm的方格棋盘,他决定把kk面旗帜插到棋盘上。每面旗帜的位置都由一个整数对\left(x,y \right)(x,y)来描述,表示该旗帜被插在了第xx行第yy列。插完旗帜后,kblack突然对那些没有插过旗帜的行和列很不满,于是他想知道,有多少行、列上所有格子都没有被插过旗帜。kblack还要把妹,于是就把这个问题丢给了你,请你帮他解决。
输入描述
由于本题输入数据较大,所以采取在程序内生成数据的方式。随机数产生器中有个内部变量xx初始时为seedseedseedseed是我们提供的随机种子。每次请求生成一个\left[l,r \right][l,r]内的随机数时,它会将xx变为\left(50268147x+6082187\right)\ mod\ 100000007(50268147x+6082187) mod 100000007,然后返回x\ mod\ \left(r-l+1 \right)+lx mod (rl+1)+l。输入包含多组数据。第一行有一个整数TT,表示测试数据的组数,对于每组数据:输入一行3个整数nnmmkkseedseed分别表示棋盘的行数、列数、棋盘上旗帜的面数、随机种子。接下来,你需要按顺序生成k面旗帜的位置信息。对于每面旗帜,依次生成一个\left[1,n \right][1,n]内的随机数和一个\left[1,m \right][1,m]内的随机数,分别表示xxyy。如果你无法理解数据生成的过程,你可以复制以下代码并调用Init函数来生成数据(限C++选手)。`const int _K=50268147,_B=6082187,_P=100000007;int _X;inline int get_rand(int _l,int _r){_X=((long long)_K*_X+_B)%_P;return _X%(_r-_l+1)+_l;}int n,m,k,seed;int x[1000006],y[1000006];void Init(){scanf("%d%d%d%d",&n,&m,&k,&seed);_X=seed;for (int i=1;i<=k;++i)x[i]=get_rand(1,n),y[i]=get_rand(1,m);}`\left(1\leq T\leq 7 \right)(1T7)\left(1\leq n,m\leq 1000000 \right)(1n,m1000000)\left(0\leq k\leq 1000000 \right)(0k1000000)\left(0\leq seed<100000007 \right)(0seed<100000007)
输出描述
对于每组测试数据输出一行2个整数,分别表示没有被插过旗帜的行、列数目。
输入样例
24 2 3 2333 4 4 2333
输出样例
2 11 0
Hint
第1组数据的旗帜的位置依次为:\left(4,2\right)(4,2),\left(1,2\right)(1,2),\left(1,2\right)(1,2)第2组数据的旗帜的位置依次为:\left(2,1 \right)(2,1),\left(2,3\right)(2,3),\left(3,4\right)(3,4),\left(3,2\right)

(3,2)

第一次AC,BC上面的题,虽然水

#include<cstdio>#include<cstring>const int _K=50268147,_B=6082187,_P=100000007;int _X;inline int get_rand(int _l,int _r){_X=((long long)_K*_X+_B)%_P;return _X%(_r-_l+1)+_l;}int n,m,k,seed;int x[1000006],y[1000006];void Init(){scanf("%d%d%d%d",&n,&m,&k,&seed);_X=seed;for (int i=1;i<=k;++i)x[i]=get_rand(1,n),y[i]=get_rand(1,m);}long long xx[1100000],yy[1100000]; int main(){long long t;while(~scanf("%lld",&t)){while(t--){memset(xx,0,sizeof(xx));memset(yy,0,sizeof(yy)); //scanf("%d%d%d%d",&n,&m,&k,&seed);Init();int i;for(i=1;i<=k;++i){if(!xx[x[i]]){--n;xx[x[i]]=1; } if(!yy[y[i]]){--m;yy[y[i]]=1; } }printf("%d %d\n",n,m); } } return 0;} 


0 0
原创粉丝点击