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;
}
};