このテクは以前見たな。
https://yukicoder.me/problems/no/2734
問題
N個の整数が与えられる。
これらを任意の順に並べ替え、文字列的に連結して整数を作る。
その場合の最小値を、998244353で割った値を求めよ。
解法
整数A,Bを文字列的に連結する場合、A+BとB+A (いずれも整数でなく文字列的に連結)のうち小さい方を取れば小さい値になる。
整数が複数個ある場合、同様の比較関数を用いてソートすると、問題文の条件を満たす順番を得られる。
int N; string S[202020]; const ll mo=998244353; bool cmp(string a,string b) { return a+b<b+a; } void solve() { int i,j,k,l,r,x,y; string s; cin>>N; FOR(i,N) cin>>S[i]; sort(S,S+N,cmp); ll ret=0; FOR(i,N) { FORR(c,S[i]) ret=(ret*10+c-'0')%mo; } cout<<ret<<endl; }
まとめ
このテク最初に見たのはARCのだいぶ初期だったか?