Codeforces Global Round 14-B. Phoenix and Puzzle-质因数拆解
Posted Chivas_/Regal
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Global Round 14-B. Phoenix and Puzzle-质因数拆解相关的知识,希望对你有一定的参考价值。
题目:
思路:
不得不说这个题的样例着实有点唬人害我WA了一发
我们不难得知如果因数没2,每个方块无法分成两个等腰三角形,所以必须有2
然后每个方块都可以由一个数num的平方分割成num*num个相等的方块
例如:18 = 2 * 3 * 3,可以先分解为9个相等的正方形,然后每个正方形再斜向分割一下,YES
再例如:450 = 2 * 3 * 3 * 5 * 5,可以先分解为9个相等的正方形,每个正方形再分解为25个相等的正方形,再斜向分割一下,YES
所以这个问题就转化为了:
1.查询是否有2这个因数
2.查询每个质因数的个数是否为偶数
采用质因数拆解
代码:
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <unordered_map>
#include <stack>
#include <string>
#include <vector>
#define IOS ios::sync_with_stdio(false)
#define rep1(i, a, n) for (int i = a; i <= n; i++)
#define rep2(i, a, n) for (int i = a; i >= n; i--)
#define each_cass(cass) for(cin >> cass; cass; cass--)
#define lowbit(x) (x&-x)
#define mm(a, b) memset(a, b, sizeof(a))
#define SP system("pause")
#define Chivas int main()
#define gcd(a,b) __gcd(a,b)
#define Regal return 0
typedef long long ll;
const int INF = 0x7FFFFFFF;
const double G = 10;
const double eps = 1e-6;
const double PI = acos(-1.0);
using namespace std;
inline void solve(){
ll n;
cin >> n;
ll nn = n;
vector<ll> div;//存放质因数
unordered_map<ll, ll> cnt;//统计质因数的个数
//质因数拆解
for(ll i = 2; i * i <= nn; i ++){
while(n % i == 0){
if(!cnt[i]) div.push_back(i);//优化时间,每个质因数就放一次
cnt[i] ++;
n /= i;
}
}
if(n != 1){
if(!cnt[n]) div.push_back(n);
cnt[n] ++;
n /= n;
}
int flag = 0;//判断有没有2
for(int i = 0; i < div.size(); i ++){
if(div[i] == 2) flag=true;
else{
if(cnt[div[i]] & 1){//质因数不是2且个数为奇数
cout << "NO" << endl;
return;
}
}
}
if(!flag) cout << "NO" << endl;//没2
else cout << "YES" << endl;
}
Chivas{
IOS;
int cass;
each_cass(cass){
solve();
}
Regal;
}
以上是关于Codeforces Global Round 14-B. Phoenix and Puzzle-质因数拆解的主要内容,如果未能解决你的问题,请参考以下文章