[CF1878F] Vasilije Loves Number Theory 的题解
题目大意
令 表示 的正因子数量,给定 。现有两种操作:
- 给定 ,令 。同时询问是否存在一个正整数 满足 且 。
- 将 还原为最初的值。
数据保证任何时刻,。
思路
因为题目其实并没有要求输出 具体的值,所以我们并不需要真正的将 求解出来,而只需要判断存在性就可以了。
因为 可能会很多次被乘以 ,所以我们就可以储存 的所有的质因子。
假设 在质因数分解之后有 个质因子,而且第 个质因子出现了 次,那么总共的因子数量就是 。
对于这个性质,我们可以感性的理解一下:对于每一个质因子,我们可以选 个,即有 种可能性。通过乘法原理就可以得到因子数量为 。
如果满足 就一定可以找到满足条件的 反之就不可能,理由如下:
对于 取任何数一定满足 。
因为 ,,其中 以 为 的质因子的个数。
对于 一定可以找到一个 使 ,此时的 ,其中 是一个极大质数。
因为题目要求 ,所以只要满足 并非 的质因子即可。
AC Code
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,q;
map<int,int> mp,mp1;
void solve() {
cin>>n>>q;
for(int i=2;i*i<=n;i++) {
while(n%i==0){
mp[i]++;
n/=i;
}
}
if(n>1){
mp[n]++;
}
mp1=mp;
for (int i=1,op,x;i<=q;i++){
std::cin>>op;
if(op==2){
mp=mp1;
continue;
}
cin>>x;
for(int j=2;j*j<=x;j++) while(x%j==0) mp[j]++,x/=j;
if(x>1) mp[x]++;
int cnt=1;
for(auto i:mp) cnt*=(i.second+1);
bool flag=1;
for(int j=2;j*j<=cnt;j++){
int sum=0;
while(cnt%j==0) sum++,cnt/=j;
if(sum>mp[j]){
flag=0;
break;
}
}
if(cnt>1&&!mp[cnt]||!flag) cout<<"NO\n";
else cout<<"YES\n";
}
mp.clear();
cout<<'\n';
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin>>t;
while(t--) solve();
return 0;
}