1. 程式人生 > >Educational Codeforces Round 57 (Rated for Div. 2) ABCDEF題解

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