結果
問題 |
No.3178 free sort
|
ユーザー |
|
提出日時 | 2025-06-13 21:38:04 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 143 ms / 2,000 ms |
コード長 | 1,886 bytes |
コンパイル時間 | 1,633 ms |
コンパイル使用メモリ | 198,484 KB |
実行使用メモリ | 42,212 KB |
最終ジャッジ日時 | 2025-06-13 21:38:13 |
合計ジャッジ時間 | 8,451 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | AC * 40 |
ソースコード
#include<bits/stdc++.h> using namespace std; long long md = 998244353; const int MAXN = 1e6; vector<long long > perm(MAXN+1,1),iperm(MAXN+1,1),inv(MAXN+1); long long exGcd(long long a,long long b , long long &x,long long &y){ if(b==0){ x=1,y=0; return a; } long long x1,y1; long long d= exGcd(b,a%b,x1,y1); x = y1; y = x1 - (a/b)*y1; return d; } void initCombi(){ for(long long i =1 ;i<=MAXN;i++){ perm[i]= (perm[i-1]*i + md )%md; } vector<long long > pre(MAXN+1,1),post(MAXN+1,1); long long tot = 1; for(long long i = 2;i<=MAXN;i++){ pre[i]=(pre[i-1]*(i-1)+md)%md ; tot = (tot*i+md)%md; } for(long long i =MAXN-1;i>=1;i--){ post[i]=(post[i+1]*(i+1)+md)%md; } long long itot , y; exGcd(tot,md,itot,y); itot = (itot%md+ md)%md; for(int i =1;i<=MAXN;i++){ inv[i] = ((pre[i]*post[i]%md)*itot%md + md )%md; } for(long long i = 1;i<=MAXN;i++){ iperm[i]= (iperm[i-1] * inv[i] +md)%md; } } long long nCr(int n , int r){ return ((perm[n]*iperm[n-r])%md)*iperm[r]%md; } void solve() { // definately i cannot store that big number int mod = 998244353; // need to do the comp on the fly string s; cin>>s; vector<int> digit(10,0); for(int i =0;i<s.size();i++){ digit[s[i]-'0']++; } // need to get the factorial and reverse fact mod m long long ans = (s.size()-digit[0]); ans = (ans*perm[s.size()-1]%md + md )%md; for(int i=0;i<10;i++){ ans = (ans*iperm[digit[i]]%md + md )%md; } cout<<ans; } int main(){ initCombi(); ios::sync_with_stdio(false); cin.tie(nullptr); cout.flush(); cout<<fixed<<setprecision(9); #ifndef ONLINE_JUDGE freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif int t=1; // cin>>t; while(t--){ solve(); } return 0; }