zoukankan      html  css  js  c++  java
  • Atcoder Tenka1 Programmer Contest 2019

    C

    签到题,f[i][0/1]表示以i结尾最后一个为白/黑的最小值,转移显然。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=2e5+7;
    int n,f[N][2];
    char s[N];
    int main()
    {
        scanf("%d",&n);
        scanf("%s",s+1);
        for(int i=1;i<=n;i++)
        if(s[i]=='.')
        {
            f[i][0]=f[i-1][0];
            f[i][1]=min(f[i-1][0],f[i-1][1])+1;
        }
        else{
            f[i][0]=f[i-1][0]+1;
            f[i][1]=min(f[i-1][0],f[i-1][1]);
        }
        printf("%d
    ",min(f[n][0],f[n][1]));
    }
    View Code

    D

    方案数=总方案数-不能拼成三角形的方案数。不能拼成三角形,即最长边大于等于边总和的一半。于是可以f[i]表示以i为最长边能组成三角形的方案数,g[i]表示凑成长度为i的边方案。f[0]=2^n,g[0]=1,然后每次转移f除以2即可。注意讨论最长边为总和一半的情况(没讨论WA了一发)。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=307,mod=998244353,inv2=499122177,inv3=332748118;
    int n,ans,sum,lim,pw2[N],pw3[N],a[N],f[N*N],g[N*N];
    int main()
    {
        scanf("%d",&n);
        ans=f[0]=g[0]=1;
        for(int i=1;i<=n;i++)f[0]=2ll*f[0]%mod;
        for(int i=1;i<=n;i++)
        {
            ans=3ll*ans%mod;
            scanf("%d",&a[i]);
            sum+=a[i];
            for(int j=sum;j>=a[i];j--)
            f[j]=(f[j]+1ll*f[j-a[i]]*inv2)%mod,g[j]=(g[j]+g[j-a[i]])%mod;
        }
        lim=(sum+1)/2;
        for(int i=lim;i<=sum;i++)ans=(ans-3ll*f[i]%mod+mod)%mod;
        if(sum%2==0)ans=(ans+3ll*g[lim])%mod;
        printf("%d
    ",ans);
    }
    View Code

    E

    很容易发现答案只有2种:1、所有系数的gcd的质因数。2、1~n以内符合条件的数(具体证明是看官方题解的)。第一种无脑枚举,第二种直接O(n^2)暴力即可。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=2e5+7;
    int n,m,a[N],h[N];
    set<int>ans;
    void check(int p)
    {
        for(int i=0;i<p-1;i++)h[i]=0;
        for(int i=0,x;i<=n;i++)x=i%(p-1),h[x]=(h[x]+a[i])%p;
        for(int i=0;i<p-1;i++)if(h[i])return;
        ans.insert(p);
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=n;i>=0;i--)scanf("%d",&a[i]),m=__gcd(m,abs(a[i]));
        for(int i=2;i*i<=m;i++)
        if(m%i==0)
        {
            ans.insert(i);
            while(m%i==0)m/=i;
        }
        if(m!=1)ans.insert(m);
        for(int i=2;i<=n;i++)
        if(a[0]%i==0)
        {
            int flag=1;
            for(int j=2;j*j<=i;j++)if(i%j==0){flag=0;break;}
            if(flag)check(i);
        }
        for(auto x:ans)printf("%d
    ",x);
    }
    View Code

    F

    rank=105,rating+=108,因为原本rating过低。

  • 相关阅读:
    Delphi常用内存管理函数
    delphi中VirtualStringTree树使用方法
    Delphi常量
    delphi中的copy函数和pos函数
    delphi 中 delete的用法
    字软元件和位软元件的区别
    Virtual Treeview使用要点
    QTreeWidget搜索功能---遍历QTreeWidget
    C 语言使用 sqlite3
    opendir 与 readdir
  • 原文地址:https://www.cnblogs.com/hfctf0210/p/10743123.html
Copyright © 2011-2022 走看看