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; }