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