Post

CF1866题解(COMPFEST 15 - Preliminary Online Mirror (Unrated, ICPC Rules, Teams Preferred))

CF1866

A - Ambitious Kid

题意:每次操作能使数组一个数减1或加1,问最小操作数使 $a_1 \cdot a_2 \cdot …. \cdot a_n=0$
思路:求最小绝对值

void solve(){
	int n;
	int ans=INF;
	cin>>n;
	for(int i=1,x;i<=n;i++){
		cin>>x;
		ans=min(ans,abs(x));
	}
	cout<<ans<<'\n';
}

B - Battling with Numbers

题意:
$X=a_1^{b_1}\cdot a_2^{b_2}\cdot……$
$Y=c_1^{d_1}\cdot c_2^{d_2}\cdot……$
求多少对p,q使 $LCM(p,q)=X$ , $GCD(p,q)=Y$
思路:LCM必定大于等于GCD,X必定包含Y的质因数且指数比Y大,否则输出0
利用 $LCM\cdot GCD=p\cdot q$ ,所以 $X\cdot Y=p\cdot q$
只需要求其中一个数有多少种可能,易想到第一个数为Y本身
设Z=X/Y,题目转化为从Z中取若干个质因数(包括次数)与Y相乘得到的数有多少种
假设Z有n个质因数,则种类为 ( $ C_{n}^{0}+C_{n}^{1}+…+C_{n}^{n}=2^n$)

注意:用快速幂算 $ 2^n $,每次取模

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
struct node{
	int a,b;
	bool operator<(const node&tmp){
		return a<tmp.a;
	}
};
ll ksm(ll a,ll b){
	ll ans=1;
	for(;b;b>>=1){
		if(b&1)ans=(ans*a)%mod;
		a=(a*a)%mod;
	}
	return ans%mod;
}
//bool solve(){
void solve(){
	int n;
	cin>>n;
	vector<node> a(n+1);
	unordered_map<int,int> vis;
	for(int i=1;i<=n;i++)cin>>a[i].a;
	for(int i=1;i<=n;i++)cin>>a[i].b,vis[a[i].a]=a[i].b;
	int m;
	cin>>m;
	vector<node> b(m+1);
	ll ans=0;
	for(int i=1;i<=m;i++)cin>>b[i].a;
	for(int i=1;i<=m;i++)cin>>b[i].b;
	if(n<m){
		cout<<"0\n";
		return;
	}
	bool g=0;
	for(int i=1;i<=m;i++){
		if(vis[b[i].a]<b[i].b){
			cout<<"0\n";
			return;
		}
		if(vis[b[i].a]>b[i].b)ans=(ans+1)%mod;
	}
	ans=(ans+n-m)%mod;
 
	cout<<ksm(2,ans)<<'\n';
}
This post is licensed under CC BY 4.0 by the author.