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;
}