CF1242A Tile Painting 题解
CF1242A Tile Painting
思路
看到这个题目的数据范围,题目又和质因数分解有关,不难想到复杂度上限为 \(O(\sqrt{N})\)。
-
可以发现,如果 \(N\) 可以表示为它的最小质因子 \(p\) 的幂(即 \(N = p^k,k \in N^+\)),
那么 \(x,x + p\ldots x+(\frac{n}{p}-1)\times p\) 的颜色都是相同的,只有 \([1,p]\) 可以取到不同的颜色。
答案自然就是 \(p\)。 -
另一种情况,就是 \(N\) 由不同的质因子组成,设其中两个为 \(a,b\) 。
手推几组样例可以发现,这种情况时所有的格子都必须是一个颜色。
(然而我并不会证明,所以去看了题解的证明,下面是题解中的证明)
证明:
因为 \(a,b\) 是 \(N\) 的不同质因子,所以 \(\gcd(a,b)=1\) 。
故对于任意一个非负整数 \(m\) ,方程 \(ax + by = m\) 始终有整数解 \(x,y\) 。
也就是说,如果我们把题目中两个相同颜色格子间的转移比作跨越,
那么从格子 \(1\) 可以跨越到所有格子,故所有格子颜色均一致。
算法设计
根据刚刚的推导,可以设计出一个简单的算法:
对 \(N\) 分解质因数,若质因数只有一个,则答案为该质因数,否则答案为 \(1\)。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
ll n;
vector<ll> ans;
void solve(ll n) {
for(ll i = 2;i * i <= n;++ i) {
if(!(n % i)) {
ans.push_back(i);
while(!(n % i))n /= i;
}
}
if(n > 1)ans.push_back(n);
return ;
}
int main() {
scanf("%lld",&n);
solve(n);
if(ans.size() == 1)printf("%lld\n",ans[0]);
else puts("1");
return 0;
}