G题几乎相同代码一个能过,一个过不了
//代码1,能过 #include <bits/stdc++.h> using namespace std; using ll = long long; const ll MOD = 1000000007; const int N = 100005; int n; int b[2 * N]; ll ops[101][N]; ll fast_expo(ll a, ll n) { ll b = 1; while (n) { if (n & 1) b = b * a % MOD; a = a * a % MOD; n >>= 1; } return b; } void solve() { cin >> n; for (int i = 0; i < 2 * n; i++) { cin >> b[i]; } for (int i = 1; i <= 100; i++) { for (int j = 1; j <= n; j++) { ops[i][j] = ((100 - i) * (ops[i][j - 1]) % MOD + 100) * fast_expo(i, MOD - 2) % MOD; } } for (int i = 1; i <= 100; i++) { for (int j = 1; j <= n; j++) { ops[i][j] = (ops[i][j] + ops[i][j - 1]) % MOD; } } sort(b, b + 2 * n); ll ans = 0; for (int i = 0; i < 2 * n; i++) { ans += ops[b[i]][i / 2 + 1]; } ans %= MOD; cout << ans << endl; } int main() { cin.tie(nullptr); ios::sync_with_stdio(false); solve(); return 0; }
//代码2,过不了 #include <bits/stdc++.h> using namespace std; using ll = long long; const ll MOD = 1000000007; const int N = 100005; int n; int b[2 * N]; ll ops[101][N]; ll fast_expo(ll a, ll n) { ll b = 1; while (n) { if (n & 1) b = b * a % MOD; a = a * a % MOD; n >>= 1; } return b; } void solve() { cin >> n; for (int i = 0; i < 2 * n; i++) { cin >> b[i]; } for (int i = 1; i <= 100; i++) { for (int j = 1; j <= n; j++) { ops[i][j] = ((100 - i) * (ops[i][j - 1]) % MOD + 100) * fast_expo(i, MOD - 2) % MOD; ops[i][j] = (ops[i][j] + ops[i][j - 1]) % MOD; } } sort(b, b + 2 * n); ll ans = 0; for (int i = 0; i < 2 * n; i++) { ans += ops[b[i]][i / 2 + 1]; } ans %= MOD; cout << ans << endl; } int main() { cin.tie(nullptr); ios::sync_with_stdio(false); solve(); return 0; }
两个代码唯一的区别在于,代码1的30~39行合并成了代码2的30~35行。
是否是编译器优化时产生了问题?@王清楚