Codeforces Round #599 C. Tile Painting_ios

Codeforces Round #599 C. Tile Painting_ios_02

这道题的意思就是任意选择两个块,两个块的位置差的绝对值如果是总长度大于1的因子就要涂成相同的颜色,求可以涂的最大颜色数量。这道题是找到规律做出来的,赛后考虑了很久才想明白真正的原理,前八项的是1,2,3,2,5,1,7,2;N的全部因子求GCD就是答案,为什么要求GCD呢?全部因子求GCD得到的ans就是全部因子的最大因子,那么相差x*ans个长度的块是必须保证同色的,因为他们的差一定是N的因子,那要保证最大的答案就让前ans个块都是不同的颜色,这样i和i+ans个位置就是同色的。

AC代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stdlib.h>
#include<queue>
#include<map>
#include<stack>
#include<iomanip>
#include<math.h>
using namespace std;
typedef long long ll;
typedef double ld;
const int INF = 0x3f3f3f3f;
int n,m;
int i,j,k;
ll gcd(ll a,ll b)
{
return b?gcd(b,a%b):a;
}

const int N = 2e5 + 10;
vector<ll>res;
void init(ll n)
{
ll i ;
for(i=2 ; i*i<n ; i++)
{
if(n%i==0)
{
res.push_back(i);
res.push_back(n/i);
}
}
if(i*i==n)
res.push_back(i);
}
int main()
{
res.clear();
ll n;
cin>>n;
init(n);
res.push_back(n);
ll ans=res[0];
for(i=0; i<res.size(); i++)
ans=gcd(ans,res[i]);
cout<<ans<<endl;
return 0;
}