TC SRM 562 div2

250:  (x/k)*3 + (x/3) = p 给出P和K,求满足的x最小的值,直接从1到3*P枚举即可  

500:给定两个正数 N,M 1 <= A <= N, 1 <= B <= M ,  SSR(A, B) = (sqrt(A)+sqrt(B))^2  求满足SSR(A, B)为整数的可能数;

化简后可得 SSR(A, B) = A + B + 2*sqrt(A)*sqrt(B);只要满足sqrt(A)*sqrt(B)为整数即可

总的来说就两种情况:

1:A和B都是可开方的数;

2:都不是可开方的数,但是化简后的根号里面的数相同: sqrt(8) = 2*sqrt(2)   和 sqrt(2)

这里遇到了一个特别操蛋的问题,就是在计算M里面能够达到多少倍的sqrt(x) 时,用了sqrt(a)/sqrt(b)本地测试正确,提交后在系统上就是不对,无语。后来慢慢找出改成sqrt(a/b)就对了。

#line 5 "TheSquareRootDilemma.cpp"
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <fstream>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <list>
#include <stdexcept>
#include <functional>
#include <utility>
#include <ctime>
using namespace std;

#define CL(a,num) memset((a),(num),sizeof(a))
#define iabs(x)  ((x) > 0 ? (x) : -(x))
#define inf 0x7f7f7f7f
#define MOD 1073741824
#define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1

#define PB push_back
#define MP make_pair
#define REP(i,n) for(i=0;i<(n);++i)
#define FOR(i,l,h) for(i=(l);i<=(h);++i)
#define FORD(i,h,l) for(i=(h);i>=(l);--i)
typedef vector<int> VI;
typedef vector<string> VS;
typedef vector<double> VD;
typedef long long LL;
typedef pair<int,int> PII;

class TheSquareRootDilemma
{
        public:
        int countPairs(int N, int M)
        {

            int i;
            int qnum = (int)sqrt(1.0*M);//计算出M中有多少个可开方数
            int sum = 0;

            for (i = 1; i <= N; ++i)
            {
                double a = sqrt(1.0*i);
                if (a == (int)a)
                {
                    sum += qnum;
                }
                else
                {
                    int tmp = i;
                    double bi = sqrt(1.0*tmp);
                    int biNum = (int)bi;
                    //对该数化简

                    for (int j = 2; j <= biNum; ++j)
                    {
                        while (tmp % (j*j) == 0)
                        {
                            tmp /= (j*j);
                        }
                    }
                    //计算M中能够表示最大的几倍的sqrt(tmp)
                    double b = sqrt(1.0*M)/sqrt(1.0*tmp);
                    int bnum = (int)b;
                    if (bnum >= 1){
                        sum += bnum;
                    }
                }
            }
            return sum;
        }

};

  

 

 

posted @ 2013-01-22 11:46  E_star  阅读(307)  评论(2编辑  收藏  举报