爱奇艺笔试题SSR(java试题,全用c++过,感觉很尴尬)
先筛出1-1e5的平方数
扫1-n区间,记录平方数,并且统计区间内,每个数需要什么因子才可以被开平方
扫1-m区间,记录平方数,并且统计区间内,每个数需要什么因子才可以被开平方
两数平方根的平方,是否是整数,其实就是sqrt(a*b)是否是整数
(sqrt(a)+sqrt(b))² = a+b +2sqrt(a*b)
所以答案便是
a可能的平方数*b可能的平方数
加上 a所需因子与b所需因子相同的数 eg:12(2倍根号3)与27(3倍根号3)所需的因子数都是3
#include <iostream> #include <algorithm> #include <stdio.h> #include <string.h> #include <math.h> #include <stack> using namespace std; const int maxn = 1e+5 + 10; int flag1[maxn]; int flag2[maxn]; int flag[maxn]; int sqrtnum[maxn]; int main() { int n, m; cin >> n >> m; int sqrt1 = 0; for(int i = 1; i < maxn; ++i) { int sqt = sqrt(i); if(sqt * sqt == i) { flag[i] = 1; sqrtnum[sqrt1++] = i; } } for(int i = 1 ; i <= n ; ++i) { if(flag[i] == 1){ flag1[1]++; continue; } int tmp = i; for(int j = 1 ; j < sqrt1; ++j){ if(sqrtnum[j] > tmp){ break; } while(tmp%sqrtnum[j]==0){ tmp/=sqrtnum[j]; } } ++flag1[tmp]; } for(int i = 1 ; i <= m ; ++i) { if(flag[i] == 1){ flag2[1]++; continue; } int tmp = i; for(int j = 1 ; j < sqrt1; ++j){ if(sqrtnum[j] > tmp){ break; } while(tmp%sqrtnum[j]==0){ tmp/=sqrtnum[j]; } } ++flag2[tmp]; } int ans = 0; for(int i= 1; i <= maxn; ++i) { ans += flag1[i] * flag2[i]; } cout << ans <<endl; return 0; }
不会java的弱智程序员