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;

        }



};

  

 

 

你可能感兴趣的:(div)