2020牛客暑假多校 (第一场) E,J

F Infinite String Comparision


本题相当于比较 a+b 与 b+a 。这里简要证明一下,以样例的第三组数据为例子。a=“aba”,b=“abaa”,a+b=“abaabaa”,b+a=“abaaaba”。很清楚地发现,a+b>b+a,这样怎么推出a>b呢,我们一步步看,首先a[0]=b[0],a[1]=b[1],a[2]=b[2]说明a的所有元素与b的前三个元素是相等的。a[3]相当于b的第一个元素,因为a[0]=b[0],此时a[3]就相当于a[0],同理a[4]=b[1],a[5]=b[2]。相当于a+a与其比较,因为a[3]=b[3],说明a[0]=a[3]=b[0]=b[3],因为b[4]相当于b[0](a[0]=b[0])。所以,就相当于正常比较,此时a[4]>b[4]就能说明a>b。

#include <iostream>
#include <stdio.h>
using namespace std;
string a,b;
int main()
{
    while(cin>>a>>b)
    {
        string a1=a+b;
        string b1=b+a;
        if(a1>b1)
        cout<<">"<<endl;
        else
        if(a1<b1)
        cout<<"<"<<endl;
        else
        cout<<"="<<endl;
    }
    return 0;
}

J Easy Integration


通过分部积分可以得到一个公式。

然后预处理,1/n!和n!,之后直接计算即可。

#include <iostream>
#include <stdio.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
const ll mod=998244353;
ll n;
ll a[maxn],inv[2*maxn+1];
ll quickpow(ll x,ll y)
{
    ll res=1;
    while(y)
    {
        if(y&1)
        res=res*x%mod;
        x=x*x%mod;
        y>>=1;
    }
    return res;
}
int main()
{
    a[0]=1;
    inv[0]=1;
    for(int i=1;i<=1000000;++i)
    {
        a[i]=a[i-1]*i%mod;
        inv[i]=inv[i-1]*quickpow(i,mod-2)%mod;
    }
    for(int i=1000001;i<=2000001;++i)
    inv[i]=inv[i-1]*quickpow(i,mod-2)%mod;
    while(~scanf("%lld",&n))
    {
        printf("%lld\n",(a[n]*a[n]%mod)*inv[2*n+1]%mod);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44491423/article/details/108010310