题解: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;
}