Problem - F - Codeforces
思路:分析一下题意,对于第一种操作来说,每次乘以x,那么n=n*x,然后问是否存在一个a使得gcd(n,a)=1并且n*a的约数个数等于n,有最大公约数等于1我们能够知道其实这两个数是互质的,所以d(n)*d(a)=d(n*a),那么就是要d(a)=n/d(n),所以n%d(n)一定要等于零,同时又因为当取模等于零时我们发现一定可以构造除一种方案,我们先选择一个与n互质的数x,然后让a=x^t,此时a共有(t+1)个约数,所以我们只需要让(t+1)=n/d(n)就能够构造出来,所以现在的问题变成了,我们能够判断n%d(n)等于0,我们知道一个因数个数的公式,就是所有质因数的个数加一的累乘,那么我们只需要维护n的所有质因数的个数即可,同时n并不能够直接乘以x,因为可能会乘的很大,所以我们在求出来d(n)之后,可以看看n与所有的x能否把d(n)消完,如果能消则代表可以
// Problem: F. Vasilije Loves Number Theory
// Contest: Codeforces - Codeforces Round 900 (Div. 3)
// URL: https://codeforces.com/contest/1878/problem/F
// Memory Limit: 256 MB
// Time Limit: 2000 ms#include<bits/stdc++.h>
#include<sstream>
#include<cassert>
#define fi first
#define se second
#define i128 __int128
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> PII;
const double eps=1e-7;
const int N=5e5+7 ,M=5e5+7, INF=0x3f3f3f3f,mod=1e9+7,mod1=998244353;
const long long int llINF=0x3f3f3f3f3f3f3f3f;
inline ll read() {ll x=0,f=1;char c=getchar();while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=(ll)x*10+c-'0';c=getchar();} return x*f;}
inline void write(ll x) {if(x < 0) {putchar('-'); x = -x;}if(x >= 10) write(x / 10);putchar(x % 10 + '0');}
inline void write(ll x,char ch) {write(x);putchar(ch);}
void stin() {freopen("in_put.txt","r",stdin);freopen("my_out_put.txt","w",stdout);}
bool cmp0(int a,int b) {return a>b;}
template<typename T> T gcd(T a,T b) {return b==0?a:gcd(b,a%b);}
template<typename T> T lcm(T a,T b) {return a*b/gcd(a,b);}
void hack() {printf("\n----------------------------------\n");}int T,hackT;
ll n,m,k;
int pr[N],ttcnt;
bool st[N];
int cnt[N];
map<int,int> tcnt;void init() {for(int i=2;i<=1000;i++) {if(!st[i]) pr[ttcnt++]=i;for(int j=0;pr[j]<=1000/i;j++) {st[pr[j]*i]=true;if(i%pr[j]==0) break;}}
}void t_init(int x) {tcnt.clear();for(int i=0;i<ttcnt;i++) cnt[pr[i]]=0;for(int j=0;j<ttcnt;j++) {if(pr[j]>x) break;while(x%pr[j]==0) {cnt[pr[j]]++;x/=pr[j];}}if(x!=1) tcnt[x]++;
}int get() {int res=1;for(int i=0;i<ttcnt;i++) res=res*(cnt[pr[i]]+1);for(auto &it:tcnt) res=res*(it.se+1);return res;
}void change(int x,int &d) {int s=gcd(x,d);d/=s;
}bool check(vector<int> &temp,int d) {change(n,d);for(int i=0;i<temp.size();i++) change(temp[i],d);if(d==1) return true;else return false;
}void solve() {n=read();int q=read();t_init(n);vector<int> temp;while(q--) {int op=read();if(op==1) {int x=read();temp.push_back(x);for(int j=0;j<ttcnt;j++) {if(pr[j]>x) break;while(x%pr[j]==0) {cnt[pr[j]]++;x/=pr[j];}}if(x!=1) tcnt[x]++;if(check(temp,get())) printf("YES\n");else printf("NO\n");}else if(op==2) {t_init(n);temp.clear();}}
} int main() {init();// stin();// ios::sync_with_stdio(false); scanf("%d",&T);// T=1; while(T--) hackT++,solve();return 0;
}