爱奇艺笔试题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的弱智程序员

#爱奇艺#
全部评论
你这个写的绝味复
点赞 回复 分享
发布于 2017-09-10 23:51
 膜大佬!
点赞 回复 分享
发布于 2017-09-10 22:51

相关推荐

06-28 22:48
已编辑
广东金融学院 Java
小浪_Coding:学院本+这俩项目不是buff叠满了嘛
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务