メモ

yukicoderでゆるふわgolf

yukicoder No.300 平方数

問題はこちら
No.300 平方数 - yukicoder

「平方数⇔素因数分解した時の指数が全て偶数」なので、Xを素因数分解して、指数が奇数のものを掛けあわせれば良い
最悪でもX自身をかければ平方数になるので、Y≦X≦10^12

int main(){
	long x,y=1,i,p;
	scanf("%ld",&x);
	for(p=2;p*p<=x;p++)if(x%p==0){
		i=0;
		while(x%p==0){
			x/=p;
			i++;
		}
		if(i%2==1)y*=p;
	}
	printf("%ld",y);
	return 0;
}

Xを素因数分解した時の指数が全て1ならYとしてX自身を取るよりほかないので、「Xから平方因子を除いていく」という方法でも答えを得ることができる

int main(){
	long x,p;
	scanf("%ld",&x);
	for(p=2;p*p<=x;p++)while(x%(p*p)==0)x/=p*p;
	printf("%ld",x);
	return 0;
}

これを縮めて

long x,p=2;
main(){
	for(scanf("%ld",&x);x%(p*p)?x/++p/p:(x/=p*p););
	x=!printf("%ld",x);
}

85B

2017/08/12追記
よく考えたらそんな難しいことをしなくても、Xの最大の平方因子をn^2とするとX/(n^2)が答えなので、単純なfor文で書ける

long x,p=1e6;
main(){
	for(scanf("%ld",&x);x%(p*p);p--);
	printf("%ld",x/p/p);
}

74B