AtCoder Beginner Contest 238(A-D)

简介: 算法

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个旋转角度和一个圆,接下来这个圆会顺时针角度旋转,并且每次转动完之后会分割一下,求最后分解完之后分割间隔最大的角度是多少,看完图就知道辽

1.png

思路:将圆抽象化一下直接变成一条直线,然后用数组模拟打标机就等于分割,每次遇到分割点就标机一下,然后记得圆的角度是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


题意:懒得翻译,贴个图,就几个两个数学关系式看懂就行了

2.png

思路:我是用逆元+一个数学简单的求和公式过的,不知道大家的写法,但赛后看大佬的视频下好像有人卡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;
}
相关文章
|
算法
AtCoder Beginner Contest 213 E - Stronger Takahashi(01BFS)
AtCoder Beginner Contest 213 E - Stronger Takahashi(01BFS)
135 0
|
机器学习/深度学习 人工智能 Java
AtCoder Beginner Contest 215 D - Coprime 2 (质因子分解 gcd)
AtCoder Beginner Contest 215 D - Coprime 2 (质因子分解 gcd)
105 0
|
人工智能
atcoder AtCoder Beginner Contest 210 D - National Railway(dp)
atcoder AtCoder Beginner Contest 210 D - National Railway(dp)
114 0
AtCoder Beginner Contest 133 E - Virus Tree 2(组合数学)
AtCoder Beginner Contest 133 E - Virus Tree 2(组合数学)
104 0
|
机器学习/深度学习
AtCoder Beginner Contest 215 E - Chain Contestant (状压dp)
AtCoder Beginner Contest 215 E - Chain Contestant (状压dp)
120 0
|
机器学习/深度学习
AtCoder Beginner Contest 218 C - Shapes (模拟)
AtCoder Beginner Contest 218 C - Shapes (模拟)
144 0
|
定位技术
German collegiate programming contest 2012 - Ski Jumping
首先用动能定理算出平抛的初速度v0,然后分三种情况,0~L/2,L/2~L,L~无穷远。
135 0
German collegiate programming contest 2012 - Ski Jumping