Educational Codeforces Round 57 (Rated for Div. 2) ABCDEF题解

题目总链接:https://codeforces.com/contest/1096

A. Find Divisible

题意:

给出l,r,在[l,r]里面找两个数x,y,使得y%x==0,保证有解。

题解:

直接输出l,2*l就好啦,但我还是写了个循环...

代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 10;
int T;
ll l,r;
int main(){
    cin>>T;
    while(T--){
        scanf("%I64d%I64d",&l,&r);
        for(ll i=l;i<=r;i++){
            if(i*2<=r){
                printf("%I64d %I64d\n",i,2*i);
                break ;
            }
        }

    }
    return 0;
}
View Code

B. Substring Removal

题意:

给出一个字符串,现在要你删掉一个子串,使得剩下的串有不多于一个的字符。

题解:

从两端找连续的相同字符串并且统计个数,然后算算就可以了。

注意一下所有字符串都相等的情况。

还有一种情况就是两段连续的字符串字符都相等,那么这时就可以删掉中间的,这个个数也比较好统计。

具体见代码(注意中间计算过程不要爆int):

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5+5,MOD = 998244353;
int n;
char s[N];
int main(){
    scanf("%d",&n);
    scanf("%s",s);
    char fir = s[0];
    int i;
    ll cnt1=1,cnt2=1;
    for(i=1;i<n;i++){
        if(s[i]==fir) cnt1++;
        else break ;
    }
    char last = s[n-1];
    for(i=n-2;i>=0;i--){
        if(s[i]==last) cnt2++;
        else break ;
    }
    ll ans = (cnt1+cnt2+1)%MOD;
    if(last==fir){
        ans=(ans+cnt1*cnt2)%MOD;
    }
    cout<<ans<<endl;
    return 0;
}
View Code

C. Polygon for the Angle

题意:

给出一个角度(0<=angle<180),求出最小的正多边形,满足其中存在一个内接三角形的内角与给出的角度相等。

题解:

我的做法比较暴力了,先说说我的吧:

n边形的内角和为(n-2)*180,然后可以知道其每个内角为(n-2)*180/n,利用外接圆+一些圆的性质(圆心角等于二倍圆周角)可以知道一个正n边形的内接三角形的最小角为180/n。

之后只要判断angle%(180/n)是否为0就是了。注意最小角可以为小数,所以我直接是暴力循环...

正解是这样的,首先推出最小角为180/n,然后如果满足angle%(180/n)==0的话,则有n*angle=t*180。

由于180和angle为已知量,我们就可以求出g=gcd(angle,180),然后等式则有n*angle/g = t*180/g。

由这可以知道n=x*180/g , t=y*angle/g,我们知道,这里的t满足t*180/n=angle,当t=n-2时,这时就是正多边形的内角,所以有限制条件:1<=t<=n-2。

我们取x=y=1,这里的n就是答案了(贪心),但是可能会存在这种情况:t=n-1,这时不符合限制条件的,这里我们只要取x=2就行了。

可以证明,当x>=2时,t<=n-2恒成立。

给出我的暴力代码....

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int T;
int ang;
int main(){
    cin>>T;
    while(T--){
        scanf("%d",&ang);
        double ans ;
        int flag;
        for(int i=3;i<=360;i++){
            ans = (double)180/i;
            flag=0;
            if(180%i!=0) for(int j=1;;j++){
                if(j*ans>ang){
                    flag=1;
                    break ;
                }else if((double)j*ans==(double)ang){
                    cout<<i<<endl;
                    flag=2;
                    break ;
                }
            }
            if(flag==1) continue ;
            else if(flag==2) break ;
            if(ang%(int)ans==0&&ans*(i-2)>=ang){
                cout<<i<<endl;
                break ;
            }
        }
    }
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/heyuhhh/p/10211421.html