题目URL:http://codeforces.com/contest/1243/problem/C
翻译:有n块砖需要填色,填色要求:在1到n中任意找两块砖第i块和第j块,其中ij满足|i-j|>1,若n%|i-j|==0,则第i块砖与第j块砖必须同色。
心路历程:比赛中这题WA了8次,太菜了,完全靠蒙,中间怼的7发里面还有2发用文件输入输出都不改的,2发不改long long,3发没特判1和2
思路:
-
n为素数,直接输出n
-
n为1输出1,n为2输出2
-
n若有两个以上素数因子,则输出1,因为用一个因子分完之后,其他地方一定会交叉,最后导致只能有一种颜色
-
若仅有一个素数因子,则输出这个素数因子
AC代码
#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <cmath>
#include <cstring>
#include <algorithm>
#define ms(x,y) memset(x,y,sizeof(x))
#define INF 0x3f3f3f3f
#define int long long
using namespace std;
const int maxn =1005;//提交记得修改
int a[maxn];
int getDiv(int x){
int sq=sqrt(x);
for(int i=2;i<=sq;i++)if(x%i==0)return i;
return -1;
}
main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);//提交记得注释
int n;
cin>>n;
if(n==1){
cout<<1<<endl;
return 0;
}
if(n==2){
cout<<2<<endl;
return 0;
}
int x=getDiv(n);
if(x==-1){cout<<n<<endl;return 0;}
if(x*x==n){cout<<x<<endl;return 0;}
while(n%x==0)n/=x;
if(n==1)cout<<x<<endl;
else cout<<1<<endl;
}