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

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

题目传送门

题目思路

对于第一种操作:

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

对于第二种操作:

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

所以我们可以借助 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 @   M1_Byte  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示