• 牛客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分

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

     

       

  • 相关阅读:
    Vmstat主要关注哪些数据?
    Swap是个什么东东?
    Buffers与cached啥区别
    做错的题目——关于构造器返回值
    做错的题目——this的指向
    JS判断一个数是否为质数
    数组扁平化
    JS实现快速排序
    正则实现千分符
    获取鼠标的当前位置
  • 原文地址:https://www.cnblogs.com/StarRoadTang/p/11391101.html
Copyright © 2020-2023  润新知