这里是小白月赛只看出了4题的废物捏
第一题: 各位相加后取模于3输出
值得一提的是,不进位加法其实是xor异或的别称,对于二进制我们直接异或操作就好,你或许能从这题拓展出异或的深层东西?
#include <iostream>
using namespace std;
int main()
{
string s1,s2;
cin>>s1>>s2;
for(int i=0;i<3;i++)
{
cout<<(s1[i]-'0'+s2[i]-'0')%3;
}
cout<<endl;
return 0;
}
第二题 吐槽一下题面,这题题面不行
题意:给定n*m矩阵,在不断给出数组b的情况下,问矩阵有多少行包含了目前的数组b中的所有元素 shit code
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int mp[252][250];
int a[250];
int ans[250];
int main()
{
int t;
for(cin>>t;t;t--)
{
memset(a,0,sizeof(a));
memset(mp,0,sizeof(mp));
memset(ans,0,sizeof(ans));
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int temp;
cin>>temp;
mp[i][temp]++;
}
}
for(int i=1;i<=m;i++)
{
cin>>a[i];
int sum=0;
for(int k=1;k<=n;k++)
{
bool falg=true;
for(int l=1;l<=i;l++)
{
if(mp[k][a[l]]==0)
{
falg=false;
}
}
if(falg)
{
sum++;
}
}
ans[i]=sum;
}
for(int i=1;i<=m;i++)
{
cout<<ans[i]<<" ";
}
cout<<endl;
}
return 0;
}
第三题
根据他给的公式
我们不难想,如果在and运算下a1的第i位二进制有1并且整个数组的第i位二进制1的个数大于1,那么or运算之后这个二进制位肯定留下了。 再看他们自身和自身做and运算,所以答案就是整个数组的异或和
这题建议改成自身不会做and运算,否则太简单了。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5+100;
signed main()
{
int t;
for(cin>>t;t;t--)
{
int sum=0ll;
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int temp;
cin>>temp;
sum^=temp;
}
cout<<sum<<endl;
}
return 0;
}
第四题 开口向下的二次函数,观察之后发现解是固定的,把大于0的区间全部加起来就好了,
用到了不少数学公式和取模运算,我码给大了
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 998244353ll;
int a,b;
int fastpow(int n,int a)
{
int res=1ll;
while(n)
{
if(n&1ll)
{
res=res*a%mod;
}
a=a*a%mod;
n>>=1ll;
}
return res;
}
int inv6,inv2;
int cal(int n)
{
int ans=-n*(n+1)%mod*(2*n+1)%mod*inv6%mod;
ans=ans-a*b%mod*n%mod;
ans=ans+n*(n+1)%mod*inv2%mod*(a+b)%mod;
ans=(ans%mod+mod)%mod;
return ans;
}
signed main()
{
inv6=fastpow(mod-2,6ll);
inv2=fastpow(mod-2,2ll);
int t;
for(cin>>t;t;t--)
{
cin>>a>>b;
cout<<(cal(b)-cal(a)+mod)%mod<<endl;
}
return 0;
}
|