tyvj 笔记本电脑

P1330 笔记本电脑
时间: 1000ms / 空间: 131072KiB / Java类名: Main

描述

事情的经过是这个样子的,信息班添置了许多新电脑(生物计算机,量子计算机;上世纪的,本世纪的),但是邪恶的教务处竟然“借”走了一台笔记本电脑(怒ing),据说还是用于私人用途(暴怒ing)……
曹老师不辞辛苦,一次次向教务处的主任们提出严正抗议(苦口婆心的,语重心长的,真诚恳切的),终于在种种力量的配合下,大主任决定归还所借走的笔记本电脑,但是我们那猥琐的胖主任(俗称郭胖子)认为不能让我们的笔记本回归得那么轻松,由于胖主任是教数学的,于是他对他认为不精通数学曹老师说:“我现在有这么一个问题,给定一个正整数n,你需要求出最小的正整数x在y为正整数的情况下使sqrt(n)=sqrt(x)-sqrt(y)”
曹老师有点郁闷,因为胖主任给了几个非常变态的数,现在他把任务布置到了信息班,希望大家能写一个程序帮他解决。

输入格式

一行,一个正整数n

输出格式

一行,一个满足条件的最小的x。

测试样例1

输入

4

输出

9

备注

对于50%的数据,n<=10000;

对于其他数据,n<=maxlongint.


sqrt(n)=sqrt(x)-sqrt(y) 最终可以化简为  x=n+2*sqrt(n*y)+y;


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
long long n,num;
long long apart(long long m)//质因数分解
{
long long ans=1;
for (long long i=2;i<=sqrt(m);i++)
if (m%i==0)
 {
  long long y=0;
  while (m%i==0)
   {
    m/=i;
    y++;
   }
  if (y%2==0)
   continue;
  else
   ans*=i;
 }
if (m!=1)
ans*=m;
return ans;

int main()
{
scanf("%I64d",&n);
long long x=apart(n);
num=n+2*sqrt(n*x)+x;
printf("%I64d",num);
}

你可能感兴趣的:(tyvj 笔记本电脑)