CF1647D Madoka and the Best School in Russia 做题记录

我不会分讨。

可以知道一个美丽数 \(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();
}

posted @ 2024-11-09 15:45  coding_goat_qwq  阅读(1)  评论(0编辑  收藏  举报