hdu 质方数

Problem Description

小明天生对数字比较敏感,3岁的时候就能背诵圆周率一百位。

现在,小明慢慢长大了,但依然很喜欢数字,最近,他迷上了质数和平方数,并且自己把质数的平方命名为“质方数”。
  现在,他在研究这样一个问题:距离一个正整数N最接近的质方数是多少?

Input

输入数据第一行是一个正整数T(T<=20),表示有T组输入数据。
接下来T行,每行输入一个正整数N(1<=N<=10^8)。

Output

对于每组数据,请输出距离N最接近的质方数,每组输出占一行。

Sample Input

2
1
10

Sample Output

4
9

水了一发杭电全国新生赛,我只想说当时题意理解错误。

玉民的代码:

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <iomanip>
 4 #include <string>
 5 #include <cstring>
 6 #include <cmath>
 7 using namespace std;
 8 int cmp(int x)
 9 {
10     if(x==1) return 0;
11     else
12     {
13         for(int i=2;i<=sqrt(x);i++)
14           if(x%i==0) return 0;
15     }
16     return 1;
17 }
18 int main()
19 {
20     int n,m,i,j,k,t;
21     cin>>t;
22     while(t--)
23     {
24         cin>>m;
25         k=sqrt(m);
26         if(m==1||m==2||m==3)
27            cout<<"4"<<endl;
28         else
29         {   int k;
30             for(i=m;;i++)
31             {   k=sqrt(i);
32                 if(k*k==i&&cmp(k)) break;
33             }
34             for(j=m;;j--)
35             {   k=sqrt(j);
36                 if(k*k==j&&cmp(k)) break;
37             }
38
39             if(i-m<m-j) cout<<i<<endl;
40             else cout<<j<<endl;
41         }
42     }
43     return 0;
44 }

时间: 2024-08-24 07:20:21

hdu 质方数的相关文章

【数论-欧拉函数】HDU 3501 Calculation 2 ( 与n不互质的数的和 )

[题目链接]click here~ [题目大意]给定整数n,求与n不互质的数的和,最后mod1e9+7 [解题思路]我们利用欧拉函数和欧几里德定理,if  gcd(n,i)==1 ,则有 gcd(n,n-i)==1 ,可以知道 其中一个若为i则存在一个为n-i 那么二者之和为n  ,这样的一共有eular(n)/2对  故与n互质的所有数的和为 n*eular(n)/2 那么与n不互质的 数就是(n)*(n-1)/2-n*eular(n)/2 [source]2010 ACM-ICPC Mult

HDU 2512 贝尔数

一卡通大冒险 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1356    Accepted Submission(s): 890 Problem Description 因为长期钻研算法, 无暇顾及个人问题,BUAA ACM/ICPC 训练小组的帅哥们大部分都是单身.某天,他们在机房商量一个绝妙的计划"一卡通大冒险".这个计

hdu 5184 卡特兰数

hdu 5184 卡特兰数 题意: 我们给出下列递归的合法括号序列的定义: 1. 空序列是合法括号序列 2. 如果s是一个合法括号序列,那么(s)也是合法括号序列 3. 如果a和b是合法括号序列,那么ab也是合法括号序列 4. 没有其它情况是合法括号序列 比如下列括号序列是合法括号序列 (), (()), ()(), ()(()) 下列括号序列则不是 (, ), )(, ((), ((() 现在,我们要构造长度为n的合法括号序列,前面的一些括号已经给出,问可以构造出多少合法序列. 限制: 1 <

2014年百度之星程序设计大赛 - 初赛(第一轮) hdu Grids (卡特兰数 大数除法取余 扩展gcd)

题目链接 分析:打表以后就能发现时卡特兰数, 但是有除法取余. f[i] = f[i-1]*(4*i - 2)/(i+1); 看了一下网上的题解,照着题解写了下面的代码,不过还是不明白,为什么用扩展gcd, 不是用逆元吗.. 网上还有别人的解释,没看懂,贴一下: (a / b) % m = ( a % (m*b)) / b 笔者注:鉴于ACM题目特别喜欢M=1000000007,为质数: 当gcd(b,m) = 1, 有性质: (a/b)%m = (a*b^-1)%m, 其中b^-1是b模m的逆

HDU 2072 单词数 --- stringstream+STL

/* HDU 2072 单词数 --- stringstream+STL */ #include <cstdio> #include <iostream> #include <sstream> #include <string> #include <set> using namespace std; set<string> k; int main() { string s; while (getline(cin, s) &&a

HDU 2072 单词数 --- 字符串处理

/* HDU 2072 单词数 --- 字符串处理 */ #include <cstdio> //C语言改成stdio.h即可 #include <cstring> //C语言改成string.h即可 const int maxn = 85; int main() { char *head1, *head2; char a[maxn]; char b[maxn][maxn]; int i, k, len, cnt1, cnt2; while (gets(a)){ //遇到字符串&q

一个简单的公式——求小于N且与N互质的数的和

首先看一个简单的东西. 若gcd(i,n)=1,则有gcd(n-i,n)=1. 于是在小于N且与N互质的数中,i与n-i总是成对存在,且相加等于n. 考虑i=n-i的特殊情况,此时n=2*i,由gcd(i,n)=1,得n=2.此时手动计算ans=1. 因为小于N且与N互质的数的个数为φ(n),于是我们可以得出公式ans=n*φ(n)/2.

欧拉函数 求小于某个数并与其互质的数的个数

1 const int maxn=32790; 2 int euler[maxn+2]; 3 void make() 4 { 5 euler[1]=0; 6 for(int i=2;i<=maxn;++i) 7 euler[i]=i; 8 for(int i=2;i<=maxn;++i) 9 if(euler[i]==i) 10 for(int j=i;j<=maxn;j+=i) 11 euler[j]=euler[j]/i*(i-1); 12 } euler[n]代表的就是在n之前与n

【欧拉函数】(小于或等于n的数中与n互质的数的数目)

[欧拉函数] 在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目.此函数以其首名研究者欧拉命名,它又称为Euler's totient function.φ函数.欧拉商数等. 例如φ(8)=4,因为1,3,5,7均和8互质. 从欧拉函数引伸出来在环论方面的事实和拉格朗日定理构成了欧拉定理的证明. [证明]: 设A, B, C是跟m, n, mn互质的数的集,据中国剩余定理,A*B和C可建立一一对应的关系.因此φ(n)的值使用算术基本定理便知, 若 n= ∏p^(α(下标p))p|