题解:P11747 「TPOI-1A」鞋子特大号

题解:P11747 「TPOI-1A」鞋子特大号

题目传送门

题目思路

对于第一种操作:

  • 首先观察样例 \(1\),因为我们选择了 \(y=1890\) 使 \(x=\gcd(2310,1890)=210\)。分解质因数得:
    • \(2310=2 \times 3 \times 5 \times 7 \times 11\)
    • \(1890=2 \times 3 \times 3 \times 3 \times 5 \times 7\)
    • \(210=2 \times 3 \times 5 \times 7\)
  • 于是我们会发现,对于第一种操作,实质上是分解质因数后取相同的质因数部分再组成一个新数。也就是说,我们要不断删去 \(x\) 的质因数。显然每次删去的个数为 \(1\) 时最优。此时答案为 \(n-1\)

对于第二种操作:

  • 同上文,\(x\) 的质因子个数应当为 \(q+1\)
  • 显然为了使这个数最小,这个数中的所有质因子当且仅当它们都为 \(2\)
  • 因此答案为 \(2^{q-1}\)

所以我们可以借助 \(3\) 个函数来实现。即质数筛、操作一对应的函数和操作二对应的函数。

代码实现

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
ll T,a,b;
bool szs(ll x){
	if(x<=1) return 0;
	for(int i=2;i<=sqrt(x);i++){
		if(x%i==0) return 0;
	}
	return 1;
}
void op1(ll b){
	ll cnt=0;
	for(int i=2;i<=sqrt(b);i++){
		if(b%i==0&&szs(i)==1){
			while(b%i==0) cnt++,b=b/i;
			if(b==1) {
				cnt=cnt-1;
				break;
			}
		}
	}
	cout<<cnt<<"\n";	
}
void op2(ll b){
	ll ans=1;
	for(ll i=1;i<=b+1;i++){
		ans=ans*2;
	}
	cout<<ans<<"\n";
}
int main(){
	cin>>T;
	while(T--){
		cin>>a>>b;
		if(a==1) op1(b);
		if(a==2) op2(b);
	}
	return 0;
}
posted @ 2025-02-15 21:49  M1_Byte  阅读(11)  评论(0编辑  收藏  举报