求调,30
查看原帖
求调,30
674967
xz001楼主2024/11/5 09:03
#include <bits/stdc++.h>

#define int __int128

using namespace std;

const int N = 1e6 + 10;

const int mod = 9223372036854775837;

int ksm (int a, int n) {
	int ans = 1;
	while (n) {
		if (n % 2) ans = ans * a % mod;
		a = a * a % mod;
		n /= 2;
	}
	return ans;
}

char s[N];

int len, now[N], ans, jc[N];

signed main() {
    scanf("%s", s + 1);
    len = strlen(s + 1);
    jc[0] = 1;
    for (int i = 1; i <= 55; ++ i ) jc[i] = jc[i - 1] * i % mod;
    for (int i = 1; i <= len; ++ i ) ++ now[s[i] - '0'];
    for (int i = 1; i <= len; ++ i ) {
    	for (int j = 0; j < s[i] - '0'; ++ j ) {
    		if (now[j]) {
    			int res = jc[len - i]; 
    			-- now[j];
    			for (int k = 0; k < 10; ++ k ) res = res * ksm (jc[now[k]], mod - 2);
    			ans = (ans + res) % mod;
    			++ now[j];
			}
		}
		-- now[s[i] - '0'];
	}
	long long ss = ans;
	printf("%lld\n", ss);
	return 0;
}

2024/11/5 09:03
加载中...