Comet OJ - Contest #10 和 EOJ Monthly 2019.9 的几道题

Comet OJ - Contest #10

A  鱼目混珠

substr直接取后几位连续子串

#include <set>
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define ll long long
using namespace std;

int main()
{
    int t,ans=0; string s; scanf("%d",&t);
    while(t--)
    {
        cin>>s; int len=s.size();
        if(len<5) continue;
        else
        {
            if(s.substr(len-5)=="acpty") ans++;
        }
    }
    printf("%d\n",ans);
    return 0;
}

 

B  沉鱼落雁

题的本质是插数字模拟,可以分成有出现3次的情况,没有出现3次的情况,没有出现3次的情况还可以分成出现2次和没出现2次的情况,没有出现2次中只要数出现1次的情况即可。

由于数的范围是1e9,用桶排计数感觉会超时,然后就用了离散化,将范围降到了1e5。

#include <set>
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define ll long long
using namespace std;
vector<int> v;
int a[100005],cnt[100005],cntt[5];

int find_key(int x)
{
    return lower_bound(v.begin(),v.end(),x)-v.begin()+1;
}

int main()
{
    int n,num; scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        v.push_back(a[i]);
    }
    sort(v.begin(),v.end());
    v.erase(unique(v.begin(),v.end()),v.end());
    for(int i=1;i<=n;i++)
    {
        cnt[find_key(a[i])]++;
    }
    int ans=0;
    for(int i=1;i<=v.size();i++)
    {
        cntt[cnt[i]]++;
    }
    if(cntt[3]>0)
    {
        ans=cntt[3]-1+cntt[2]+cntt[1]/2;
    }
    else
    {
        if(cntt[2]>1)
        {
            ans=cntt[2]-1+cntt[1];
        }
        else
            ans=cntt[1];
    }
    printf("%d\n",ans);
    return 0;
}

 

EOJ Monthly 2019.9

这场感觉比comet这场有点难啊,一个签到substr,一个签到逆元,逆元之前还没有看过......

D  站军姿

一个被当作签到的逆元题......EOJ的比赛之前的没怎么写过,感觉div2难度?

晚上写了这场,之前没看过逆元,结果轻松愉快的爆零。这个题的概率公式可以在网上找到的,所以感觉大家都签了这个题。

没有卡在这概率公式上,结果被long long的最大范围卡了(也是傻,  2^(n-1)直接用1<<(n-1)算了......这必超long long啊,而且还没法mod,直接返回最后的结果了),以后说啥次方运算只用快速幂,乘一下mod一下真舒服。逆元我用的费马小定理直接套快速幂调用就行。最后注意特判1和2。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define ll long long
using namespace std;
const int mod=1000000007;

ll qkpow(ll a,ll b)
{
    ll ans=1; a=a%mod;
    while(b)
    {
        if(b&1)ans=ans*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ans%mod;
}

int main()
{
    int t; ll n; scanf("%d",&t);
    while(t--)
    {
        scanf("%lld",&n);
        if(n==1 || n==2) printf("1\n");
        else
        {
            ll temp=qkpow(2,n-1);
            n=n%mod;
            printf("%lld\n",n*qkpow(temp,mod-2)%mod);
        }
    }
    return 0;
}

 

A   才艺展示

博弈最后输赢推导虽然看了sg函数,但这个我不会写,我太菜了。

所以这个就是看题解结论写的。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define ll long long
using namespace std;

int main()
{
    int t; ll n,cnt=1; scanf("%d",&t);
    while(t--)
    {
        bool flag=false; scanf("%lld",&n);
        while(n>0)
        {
            if((cnt & 1) && (n & 1))
            {
                flag=true; break;
            }
            n=n>>1; cnt++;
        }
        if(flag) printf("Little Fang Win\n");
        else printf("Cuber QQ Win\n");
    }
    return 0;
}

 

你可能感兴趣的:(Comet OJ - Contest #10 和 EOJ Monthly 2019.9 的几道题)