第一题:破碎的矩阵
题目链接:https://ac.nowcoder.com/acm/contest/932/A
刚看到这题的时候感觉特别熟悉...诶,这不就是codeforces某场比赛的某某题吗?(心里激动了一波)仔细看完题目
才发现这并不是codeforces那道构造题,但是多多少少还是有点类似...那题是问我们矩阵是否可以构造,这题则问的
是最多可以构造几个符合题意的矩阵。
首先要做的和cf那题一样都是先将每行的异或和异或后存于ans1,每列的异或和异或后存于ans2,这样ans1就等于每
一行的每个元素异或总和,ans2就等于每一列的每个元素异或总和。
很快我们会发现ans1、ans2其实就是这个矩阵的每一个元素的异或和,那么当ans1^ans2==0(即ans1 == ans2)时,
用题目数据构造出来的矩阵就是合法的了,否则该矩阵不存在,直接输出0即可。
那么当矩阵合法的时候我们怎么算出符合题意的矩阵的个数呢?
其实很简单——对于每行,我们可以在前面n-1列任意放置一个小于等于x的数,而第n列总有唯一合法的填数方案。
同理对于每一列也是一样的,所以我们可以得出合法的矩阵的总个数就是(x+1)的(n-1)*(m-1)次方
下面贴代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define inf 0x3f3f3f 5 const ll N = 1e6+100; 6 ll pow_mod(ll a, ll n, ll m) 7 { 8 a%=m; 9 long long ans = 1; 10 while(n) 11 { 12 if(n&1) 13 { 14 ans = (ans * a) % m; 15 } 16 a = (a * a) % m; 17 n >>= 1; 18 } 19 return ans; 20 } 21 ll n,m,x,p; 22 ll a[N],b[N]; 23 int main() 24 { 25 ios::sync_with_stdio(false); 26 int t; 27 cin>>t; 28 while(t--) 29 { 30 cin>>n>>m>>x>>p; 31 ll ans1,ans2; 32 for(ll i=1; i<=n; i++) 33 { 34 cin>>a[i]; 35 if(i == 1) 36 ans1 = a[i]; 37 else 38 ans1 = ans1^a[i]; 39 } 40 for(ll i=1; i<=m; i++) 41 { 42 cin>>b[i]; 43 if(i == 1) 44 ans2 = b[i]; 45 else 46 ans2 = ans2^b[i]; 47 } 48 if(ans1^ans2) 49 { 50 cout<<0<<endl; 51 continue; 52 } 53 54 ll ans = pow_mod(x+1,(n-1)*(m-1),p); 55 cout<<ans<<endl; 56 } 57 return 0; 58 }
第二题bit树调bug调了三十分钟测试样例还是没过,所以果断暴力取30分。
暴力完第二题已经快11点了,此时心态已崩。想着11点就可以和小伙伴们去
吃饭,直接写个特判拿了5分
以后题解多了会把这两题也补上,目前就这样...