SRM 567 div2

250pt....

 

500pt

  题意:给n和m,a,b满足(1 <= a <= n, 1 <= b <= m),SSR(a, b) = (sqrt(a) + sqrt(b))^2为整数,其实就是sqrt(a*b)为整数。

总体思路是:从1...n枚举a,看m中有多少个和a组合可以构成平方数的。

先把a因式分解,a = k1p1*k2p2*...*kxpx 找到所有pi (1 <= i <= x)中是奇数的质因子,因为幂为偶数的质因子开放的结果一定是整数,所以不用考虑偶数的情况。剩下这些设幂为奇数的质因子的积为W,比如a = 2^3*5^3*7^2, W = 2^3*5^3;要使sqrt(a*b)为整数,则a*b要试W变成W*W,也就是b中也要贡献若干个W(在保证不大于m的情况下),贡献多少个呢?W,4*W,16*W都可以,也就是说W的倍数必须要是平方数,a*b = (a里面幂为偶数的质因子)*W*W*x x为平方数。

class TheSquareRootDilemma {
public:
    int countPairs(int N, int M) {
        int t, i, j, ans = 0;
        for(i = 1; i <= N; ++i) {
            t = i;
            for(j = 2; j*j <= t; ++j) {
                while(t%(j*j) == 0) t /= (j*j);
            }
            for(j = 1; ; ++j) {
                if(t*j*j > M)   {ans += j - 1; break;}
            }
        }
        return ans;
    }
};

 

posted @ 2013-01-22 10:02  AC_Von  阅读(388)  评论(0编辑  收藏  举报