A - Exponential or Quadratic
题意:判断2的n次方和n的二次方大小
思路:简单题,直接输出即可
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
const int maxn=5005;
int main()
{
int n,d1,d2;
cin>>n;
if(pow(2,n)>pow(n,2))
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
return 0;
}
B - Pizza
题意:给你N个旋转角度和一个圆,接下来这个圆会顺时针角度旋转,并且每次转动完之后会分割一下,求最后分解完之后分割间隔最大的角度是多少,看完图就知道辽
思路:将圆抽象化一下直接变成一条直线,然后用数组模拟打标机就等于分割,每次遇到分割点就标机一下,然后记得圆的角度是360.再取谋即可。
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
const int maxn=5005;
int ans[maxn];
int main()
{
int n,i,j,d1,sum=0;
cin>>n;
ans[0]=1,ans[360]=1;
for(i=0;i<n;i++)
{
cin>>d1;
sum+=d1;
sum%=360;
ans[sum]=1;
}
int f1=0,ans1=0;
for(i=0;i<=360;i++)
{
if(ans[i]==1)
ans1=max(ans1,i-f1),f1=i;
}
cout<<ans1<<endl;
return 0;
}
C - digitnum
题意:懒得翻译,贴个图,就几个两个数学关系式看懂就行了
思路:我是用逆元+一个数学简单的求和公式过的,不知道大家的写法,但赛后看大佬的视频下好像有人卡c了,还有那个榜过D的比C多好多,好像CD都过能前2000??突然后悔昨晚没打.jpg
讲讲怎么推的吧,我首先是把1-9,然后10-99,然后100-999分开来看,不难发现发现,他们都是从1开始递增,比如1-9那么对应就是1,2,3,4…,而10-99对应也是1,2,3,4…
那么就用个等差数列求和,先用to_string()求字符串然后算出当前数字的位数,再讨论一下比如当前是两位数的情况,项数=末项-首项+1,然后Sn=n*a1+(n-1)*n/2,不过我这里把/2直接用逆元了,因为要取谋这样也方便点。注意求项数也可能很大,所以也要不断取谋,具体可以看代码
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
const int mod=998244353;
long long quickpowmod(long long a, long long b,long long modd) {
long long ret = 1;
while (b) {
if (b & 1) {
ret = ret * a%modd;
}
a = a * a%modd;
b >>=1;
}
return ret;
}
int main()
{
long long n;
long long ans=0;
cin>>n;
string s1=to_string(n);
int d=s1.length(),i,j;
if(d==1)
{
for(i=1;i<=n;i++)
ans+=i;
cout<<ans<<endl;
}
else
{
for(i=0;i<d;i++)
{
if(i==0)
{
ans+=45;
ans%=mod;
}
else if(i!=d-1)
{
long long q=9,a1=1;
for(j=0;j<i;j++) q*=10,q+=9;
for(j=0;j<i;j++) a1*=10;
q%=mod,a1%=mod;
long long nn=(q-a1+1);
// cout<<nn<<" "<<q<<" "<<a1<<endl;
nn=nn%mod*(nn-1)%mod*quickpowmod(2,mod-2,mod);
nn%=mod;
ans=ans+(q-a1+1)+nn;
ans%=mod;
}
else
{
long long a1=1;
for(j=0;j<i;j++) a1*=10;
long long q=n;
a1%=mod,q%=mod;
long long nn=(q-a1+1);
// cout<<nn<<" "<<q<<" "<<a1<<endl;
if(nn==1) nn=0;
else nn=nn%mod*(nn-1)%mod*quickpowmod(2,mod-2,mod);
nn%=mod;
// cout<<ans<<endl;
ans=ans+(q-a1+1)+nn;
ans%=mod;
}
}
cout<<ans<<endl;
}
return 0;
}
D - AND and SUM
题意:已知x&y=a,x+y=s,已知a和s求x和y是不是一定存在。
思路:因为x&y=a,所以x>=a,y>=a,所以s>=2a,那么s-2a剩下的部分只要满足(s-2*a)&a==0即可。
在这里插入代码片#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
const int mod=998244353;
int main()
{
int n,i,j,t;
cin>>t;
while(t--)
{
long long a,s;
cin>>a>>s;
// cout<<((s-2*a)&a)<<endl;
if((s>=2*a)&&(((s-2*a)&a)==0))
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
}
return 0;
}