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;
}

 

posted @ 2020-11-19 20:52  huangxuanao  阅读(193)  评论(0)    收藏  举报