SRM567Div2
Mid:
SSR(A,B) = (√A,√B)^2
という関数があって、1<=A<=N,1<=B<=Mを満たす整数A,B組み合わせの中でSSR(A,B)が整数となるものの数を求める。
本番で解けなかった。
SSR(A,B) = (√A,√B)^2 = A^2 + B^2 + 2*√(AB)
より、√(AB)の値が整数なら条件を満たす。
例えばA=2に固定した時
√2 * √2、
√2 * √8、
√2 * √18なども整数になり条件を満たす。
なのでこのような数は全部√2として扱う。
√の中に平方数を残さない(中学でやる簡単化?)よう処理をしてあげた後、
√の中が同じ物の組み同士を計算。
割と愚直にやっても計算が間に合ってしまう。
#include <vector> #include <iostream> using namespace std; class TheSquareRootDilemma { public: int div(int N) { for(int i=2; i*i<=N; ++i) { while(N%(i*i)==0) { N /= (i*i); } } return N; } int countPairs(int N, int M) { vector<int> A(80000,0),B(80000,0); for(int i=1; i<=N; ++i) A[div(i)]++; for(int i=1; i<=M; ++i) B[div(i)]++; int res=0; for(int i=1; i<80000; ++i) res += A[i]*B[i]; return res; } };