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;
}
posted @ 2022-01-13 10:40  ImALAS  阅读(34)  评论(0编辑  收藏  举报