F、 Infinite String Comparision
题意:有两个字符串,这两个字符串都可以在自身基础之上进行无限次重复,求比较这两个字符串无限次重复之后的大小。
思路:我们可以发现,两个字符串都是以自身为周期进行向外扩展,如果两个字符串最后比下来的结果是相同的话,那么它们肯定是可以在两个字符串的第一个周期之内就能比出大小来,也就是最差最差就是把最长的那个原始字符串比较之后就能比出了。我们用双指针来维护一下就行了。
代码:
#include<iostream> using namespace std; int main(){ string a,b; while(cin>>a>>b){ int len1=a.size(); int len2=b.size(); int k1=0,k2=0; //我们用k1指向a字符串,k2指向b字符串 while(1){ if(a[k1%len1]<b[k2%len2]){ //注意维护下标 cout<<"<"<<endl; break; } else if(a[k1%len1]>b[k2%len2]){ cout<<">"<<endl; break; } k1++,k2++; //也就是我们至多在两个周期之内就能比较出两者的大小 if(len1<len2){ if(k2==2*len2){ cout<<"="<<endl; break; } } else{ if(k1==2*len1){ cout<<"="<<endl; break; } } } } return 0; }
J、 Easy Integration
题意:求出 这个表达式关于n的一个关系是,然后对mod求逆元就行了。
思路:比赛的时候懵了,完全没想到求定积分,而是一味地在找规律。赛后看题解才恍然大悟。
最后我们求到了这个关于n的表达式,我们现预处理阶乘,然后求逆元即可。
代码:
#include<iostream> using namespace std; typedef long long ll; const int mod=998244353; const int maxn=2e6+5; ll f[maxn]; ll binarypow(ll a,ll b){ if(b==0) return 1; if(b&1) return a*binarypow(a,b-1)%mod; else{ ll mul=binarypow(a,b/2); return mul*mul%mod; } } int main(){ int n; f[0]=1; for(int i=1;i<=maxn;i++){ f[i]=f[i-1]*i%mod; } while(cin>>n){ ll up=(f[n]*f[n])%mod; ll down=f[2*n+1]%mod; ll ans=binarypow(down,mod-2); ans=ans*up%mod; cout<<ans<<endl; } return 0; }