题意:
给排成一行的 n 个格子,要求所有的 i,j 满足 |i−j| 是 n 的因子的,都要同色,求最大的涂色数。
Examples
Input
4
Output
2
Input
5
Output
5
思路1:
设因子为a,b,c,d,则距离为a,b,c,d的格子颜色要相同,
循环节为gcd(a,b,c,d)
答案为循环节
code1:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
#define int long long
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
signed main(){
int n;
cin>>n;
int ans=n;
for(int i=2;i*i<=n;i++){
if(n%i==0){
ans=gcd(ans,i);
ans=gcd(ans,n/i);
}
}
cout<<ans<<endl;
return 0;
}
思路2:
因为每个数可以拆成质数的积
由上面的一种思路可知,答案为所有因子的gcd
如果n有两个及以上的质因子,则答案为1(质数gcd为1),否则答案为该质因子
code:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
#define int long long
signed main(){
int n;
cin>>n;
if(n==1){
cout<<1<<endl;
return 0;
}
vector<int>ans;
for(int i=2;i*i<=n;i++){
if(n%i==0){
ans.push_back(i);
while(n%i==0){
n/=i;
}
}
}
if(n!=1){
ans.push_back(n);
}
if(ans.size()>=2){
cout<<"1"<<endl;
}else{//答案是最小质因子
cout<<ans[0]<<endl;
}
return 0;
}