【tyvj1330】笔记本电脑

描述

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

输入格式

一行,一个正整数n

输出格式

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

测试样例1

输入

4

输出

9

备注

对于50%的数据,n<=10000;
对于其他数据,n<=maxlongint.
【题解】

整理可以得到:x=n+2*sqrt(ny)+y

也就是说,求一个最小的y使ny为完全平方数

暴力分解质因数即可

【代码】

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
long long n,num,mul,ans,a,y,i;
int main(){
	scanf("%lld",&n);
	a=n,mul=1,y=1;
	for (i=2;i*i<=a;++i){
		num=0;
		while (a%i==0){
		  	num++;
		  	a/=i;
	  	}
	  	if (num%2!=0) num++,y*=i; 
		num/=2;
	  	for (int j=1;j<=num;++j) mul*=i;
	}
	if (a!=1) mul*=a,y*=a;
	ans=n+2*mul+y;
	printf("%I64d",ans);
}



你可能感兴趣的:(数论,tyvj)