牛客NOIP暑期七天营-提高组3

第一题:破碎的矩阵

题目链接: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 }
View Code

   

  第二题bit树调bug调了三十分钟测试样例还是没过,所以果断暴力取30分。

  暴力完第二题已经快11点了,此时心态已崩。想着11点就可以和小伙伴们去

  吃饭,直接写个特判拿了5分

  以后题解多了会把这两题也补上,目前就这样...

 

   

posted @ 2019-08-21 20:41  GsjzTle  阅读(210)  评论(0编辑  收藏  举报