CF1647D Madoka and the Best School in Russia 做題記錄

coding_goat_qwq發表於2024-11-09

我不會分討。

可以知道一個美麗數 \(a\) 的充要條件是 \(a=d\times k\)\(d\nmid k\)
有個樸素的想法是將給你的 \(x\) 拆成 \(d^p\times k\)

  • 顯然如果 \(p\le 1\) 那麼我們拆不動。
  • 如果 \(k\) 可以拆成大於 \(2\) 個數的乘積,那麼是可行的。
  • 如果 \(k\) 是質數,那麼我們就拆 \(d\)
    • 如果 \(d\) 是質數,就拆不了了。
    • 如果 \(d\) 不是質數:
      • 如果有個不是 \(k\) 的質因子,那麼是可行的。
      • 如果 \(k=1\),那麼是不可行的。
      • 現在 \(d=k^q\)
        • 如果 \(d=k^2\)\(p>3\),那麼可行;
        • 如果 \(q>2\)\(p>2\),那麼可行。
點選檢視程式碼
#include<bits/stdc++.h>
#define int ll
#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define inn(i,n,a) For(i,1,n) a[i]=read();

#define ll long long
#define i128 __int128

using namespace std;
inline int read() {
	int xx= 0;int f= 1;
	char c = getchar();
	while(c<'0'||c>'9') { 
		if(c=='-') f= -1;
		c= getchar();
	}
	while(c>='0'&&c<='9') {
		xx= (xx<<1)+(xx<<3)+(c^48);
		c= getchar();
	}
	return xx*f;
}
#define maxn 200050
int x,d;
void work() {
	in2(x,d);
	int cnt=0;
	while(x%d==0) x/=d,cnt++;
	if(cnt<2) return cout<<"NO\n",void();
	for(int i=2;i*i<=x;i++) {
		if(x%i==0) return cout<<"YES\n",void();
	}
	bool pr=1;
	for(int i=2;i*i<=d;i++)
		if(d%i==0) {
			pr=0;
			break;
		}
	if(pr) return cout<<"NO\n",void();
	if(cnt>2) {
		for(int i=2;i*i<=d;i++)
			if(d%i==0&&(i!=x||(d/i!=x))) return cout<<"YES\n",void();
	}
	if(x==1) return cout<<"NO\n",void();
	int	cnt2=0;
	while(d%x==0) cnt2++,d/=x;
	if(cnt2>2&&cnt>2) return cout<<"YES\n",void();
	if(cnt2==2&&cnt>3) return cout<<"YES\n",void();
	return cout<<"NO\n",void();
}
signed main() {
	int _=read();
	while(_--) work();
}