Codeforces Round #680 (Div. 1, based on Moscow Team Olympiad)题解
A.Division
题解:如果p为q的倍数,则输出p
否则对q分解质因数,要使$x \mid p$且$q \nmid x$,则$p/x$至少有一个质因数次次数大于$q$,于是我们找到最小的质因数次幂$s$,则$x=\dfrac{p}{s}$
(考场代码,很垃圾)
#include <cstdio>
#include <iostream>
#define ll long long
using namespace std;
ll p, q, ans;
void solve() {
cin >> p >> q;
if(p % q) {
cout << p << endl;
return;
}
//p为q的倍数
ll chu = p; ans = p;
for(ll i = 2; i * i <= q; i++) {
int cnt1, cnt2; cnt1 = cnt2 = 0;
while(chu % i == 0) chu /= i, cnt1++;
while(q % i == 0) q /= i, cnt2++;
if(cnt2 == 0) continue;
ll sum = 1;
for(int j = 1; j <= cnt1-cnt2+1; j++) sum *= i;
ans = min(ans, sum);
}
if(q == 1) cout << p / ans << endl;
else {
int cnt1 = 0;
while(chu % q == 0) chu /= q, cnt1++;
ll sum = 1;
for(int j = 1; j <= cnt1; j++) sum *= q;
ans = min(ans, sum);
cout << p / ans << endl;
}
}
int main() {
int t; cin >> t;
while(t--) solve();
return 0;
}
B.Divide and Sum
题解:我们对序列排序,并将绝对值转化为大数减小数
发现排序后的区间$[1,n]$内总是被减数,区间$[n+1,2n]$总是减数,出现次数均为$C_{2n-1}^{n-1}$
于是答案为$C_{2n-1}^{n-1}*(sum_{n+1,2n}-sum_{1,n})$
#include <cstdio>
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
int n;
ll a[1000011];
const ll mod = 998244353;
ll ksm(ll s1, ll s2){
if(!s2) return 1;
if(s2 % 2) return ksm(s1, s2-1) * s1 % mod;
else {
ll ret = ksm(s1, s2/2);
return ret * ret % mod;
}
}
ll C(int s1, int s2) {
ll ret = 1;
for(int i = s1-s2+1; i <= s1; i++) ret *= (ll)i, ret %= mod;
for(int i = 1; i <= s2; i++) ret *= ksm((ll)i, mod-2), ret %= mod;
return ret;
}
int main() {
cin >> n;
for(int i = 1; i <= n*2; i++) scanf("%lld", &a[i]);
sort(a+1, a+n*2+1);
ll sum = C(2*n-1, n-1), ans = 0; sum *= 2; sum %= mod;
for(int i = n+1; i <= n*2; i++) ans += (a[i] * sum) % mod, ans %= mod;
for(int i = 1; i <= n; i++) ans -= (a[i] * sum) % mod, ans = (ans % mod + mod) % mod;
cout << ans << endl;
return 0;
}

浙公网安备 33010602011771号