D - Together Square Editorial by kyopro_friends

O(N^1.5)の楽な実装

\(i\) を固定したとき、\(j\) の候補がいくつあるか求めることを考えます。
\(i\times k\) が平方数となるような最小の \(k\) は、\(i\) を平方数で割れるだけ割って残った数になります。\(i\times j\) が平方数となるような \(j\)\(k\) に平方数を掛けたものに限り、また全てその形で表せます。(証明略)
それぞれのパートは愚直に計算することで \(i\) ごとに \(O(\sqrt{N})\)\(j\) を全て求めることができ、全体で \(O(N^{1.5})\) でこの問題が解けます。

実装例(C)

#define ll long long
int main(){
	int n;
	scanf("%d",&n);
	ll ans=0;
	for(ll i=1;i<=n;i++){
		ll k=i;
		for(ll d=2;d*d<=k;d++){
			while(k%(d*d)==0)k/=d*d;
		}
		for(ll d=1;k*d*d<=n;d++)ans++;
	}
	printf("%lld",ans);
}

posted:
last update: