Codeforces 584 - A/B/C/D/E - (Done)

連接:https://codeforces.com/contest/584html


A - Olesya and Rodion - [水]

題解:注意到 $t$ 的範圍是 $[2,10]$,對於位數小於 $2 \times 3 \times \cdots \times 10 = 3628800$ 的數,暴力枚舉去找;不然就直接在 $3628800$ 後面補零便可。ios

AC代碼:c++

#include<bits/stdc++.h>
using namespace std;
int n,t;
int p10[8];
int main()
{
    ios::sync_with_stdio(0);
    
    cin>>n>>t;
    if(n>=7)
    {
        cout<<3628800;
        for(int i=8;i<=n;i++) cout<<0;
        cout<<endl;
    }
    else
    {
        p10[0]=1;
        for(int i=1;i<8;i++) p10[i]=p10[i-1]*10;

        bool ok=0;
        for(int x=p10[n-1];x<p10[n];x++)
        {
            if(x%t==0)
            {
                cout<<x<<endl;
                ok=1;
                break;
            }
        }
        if(!ok) cout<<-1<<endl;
    }
}

 


B - Kolya and Tanya - [組合數]

題解:對於一個等邊三角形上的三我的,有 $20$ 種方案使得和不等於 $6$,有 $7$ 種方案使得和等於 $6$,而後很容易獲得公式 $\sum_{i=1}^{n} C_{n}^{i} \cdot 20^i \cdot 7^{n-i}$。spa

AC代碼:code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
int n;
ll fpow(ll a,ll n)
{
    ll res=1,base=a%mod;
    while(n)
    {
        if(n&1) res*=base, res%=mod;
        base*=base, base%=mod;
        n>>=1;
    }
    return res%mod;
}
ll inv(ll n){return fpow(n,mod-2);}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    cin>>n;
    ll ans=0;
    ll C=1ll, A=1ll, B=fpow(7ll,n);
    for(int i=1;i<=n;i++)
    {
        C=C*(n+1-i), C%=mod;
        C=C*inv(i), C%=mod;

        A*=20ll, A%=mod;
        B*=inv(7), B%=mod;

        ans+=((C*A)%mod)*B%mod, ans%=mod;
    }
    cout<<ans<<endl;
}

 


C - Marina and Vasya - [字符串]

題解:htm

要有 $t$ 個不一樣字符,就是要有 $n-t$ 個相同字符;對於 $s_1,s_2$ 兩個字符串,若是存在 $s_1[i] = s_2[i]$ 就儘可能讓 $s_3[i]$ 也是這個字符。若是直接就能把 $n-t$ 個要求相同的字符全搞定了,剩下的就能夠亂放。blog

若是還剩下來 $n-t-same$(此處 $same$ 表明 $s_1,s_2$ 中相同位置且相同字符的數目),要求有這麼多個相同字符。那記 $diff$ 表明 $s_1,s_2$ 中相同位置但不一樣字符的數目,討論一下 $2(n-t-same)$ 與 $diff$ 的關係便可。ci

AC代碼:字符串

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n,t;
string s1,s2,s3;
bool f[maxn];
int same,diff;
inline char Find(char x,char y)
{
    if(x!='a' && y!='a') return 'a';
    if(x!='b' && y!='b') return 'b';
    if(x!='c' && y!='c') return 'c';
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    cin>>n>>t; t=n-t;
    cin>>s1>>s2;

    for(int i=0;i<n;i++) s3+='0';

    int diff=0;
    for(int i=0;i<n;i++)
    {
        if(s1[i]!=s2[i]) diff++;
        if(s1[i]==s2[i] && t>0)
        {
            s3[i]=s1[i];
            t--;
        }
    }

    if(t>0)
    {
        if(2*t>diff) s3="-1";
        else
        {
            int cnt=0;
            for(int i=0;i<n;i++)
            {
                if(s3[i]!='0') continue;
                s3[i]=s1[i], cnt++;
                if(cnt==t) break;
            }
            cnt=0;
            for(int i=0;i<n;i++)
            {
                if(s3[i]!='0') continue;
                s3[i]=s2[i], cnt++;
                if(cnt==t) break;
            }

            for(int i=0;i<n;i++)
            {
                if(s3[i]!='0') continue;
                s3[i]=Find(s1[i],s2[i]);
            }
        }
    }
    else
    {
        for(int i=0;i<n;i++)
        {
            if(s3[i]!='0') continue;
            s3[i]=Find(s1[i],s2[i]);
        }
    }

    cout<<s3<<endl;
}

 


D - Dima and Lisa - [簡單數論]

題解:get

有一個命題:不小於 $6$ 的偶數都能表示成兩個質數的和,而後 $4$ 能夠表示成 $2+2$。

因此,咱們只要讓 $p_1 = 3$,那麼剩下來 $n-3$ 必爲偶數,就能找到兩個質數加起來等於它,這要求最少也要篩 $1 \sim 5e8$ 的素數,會MLE。

所以,咱們能夠找出 $1e8,2e8,\cdots,9e8$ 這些數字附近的一個素數,而後例如 $n = 5e8+6e7$ 時,咱們能夠選 $p_1 = 5e8+9$,這樣剩下來 $n - (5e8+9)$ 這個數的範圍就保證在 $1 \sim 1e8$ 之間,而後咱們只須要篩 $1 \sim 1e8$ 之間的素數就能夠了。

AC代碼:

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
int n;

const int MAX=1e8+50;
int cnt,prime[MAX/10];
bool isPrime[MAX+5];
void Screen() //歐拉篩法求素數
{
    cnt=0;
    memset(isPrime,1,sizeof(isPrime));
    isPrime[0]=isPrime[1]=0;
    for(int i=2;i<=MAX;i++)
    {
        if(isPrime[i]) prime[cnt++]=i;
        for(int j=0;j<cnt;j++)
        {
            if(i*prime[j]>MAX) break;
            isPrime[i*prime[j]]=0;
            if(i%prime[j]==0) break;
        }
    }
}

P Find(int sum)
{
    int p1=0, p2=cnt-1;
    while(p1<=p2 && prime[p1]+prime[p2]!=sum)
    {
        if(prime[p1]+prime[p2]>sum) p2--;
        else p1++;
    }
    return make_pair(prime[p1],prime[p2]);
}

int D[9]={(int)9e8-37,(int)8e8-1,(int)7e8+1,(int)6e8+1,(int)5e8+9,(int)4e8+9,(int)3e8+7,(int)2e8-9,(int)1e8+7};

int main()
{
    Screen();

    cin>>n;

    if(n==3)
    {
        printf("1\n");
        printf("3\n");
        return 0;
    }
    if(n==4)
    {
        printf("2\n");
        printf("2 2\n");
        return 0;
    }
    if(n==5)
    {
        printf("2\n");
        printf("2 3\n");
        return 0;
    }
    if(n==6)
    {
        printf("3\n");
        printf("2 2 2\n");
        return 0;
    }

    for(int i=0;i<9;i++)
    {
        if(n-D[i]>=4)
        {
            P res=Find(n-D[i]);
            printf("3\n");
            printf("%d %d %d\n",D[i],res.first,res.second);
            return 0;
        }
    }

    P res=Find(n-3);
    printf("3\n");
    printf("3 %d %d\n",res.first,res.second);
}

 


E - Anton and Ira - [貪心]

相關文章
相關標籤/搜索