Hdu 6322

做多校赛的题,自己只能做点简单的,大家都会的,菜是原罪啊。。。。

In number theory, Euler's totient function φ(n)φ(n) counts the positive integers up to a given integer nn that are relatively prime to nn. It can be defined more formally as the number of integers kk in the range 1≤k≤n1≤k≤n for which the greatest common divisor gcd(n,k)gcd(n,k) is equal to 11. 
For example, φ(9)=6φ(9)=6 because 1,2,4,5,71,2,4,5,7 and 88 are coprime with 99. As another example, φ(1)=1φ(1)=1 since for n=1n=1 the only integer in the range from 11 to nn is 11itself, and gcd(1,1)=1gcd(1,1)=1. 
A composite number is a positive integer that can be formed by multiplying together two smaller positive integers. Equivalently, it is a positive integer that has at least one divisor other than 11 and itself. So obviously 11 and all prime numbers are not composite number. 
In this problem, given integer kk, your task is to find the kk-th smallest positive integer nn, that φ(n)φ(n) is a composite number. 

Input

The first line of the input contains an integer T(1≤T≤100000)T(1≤T≤100000), denoting the number of test cases. 
In each test case, there is only one integer k(1≤k≤109)k(1≤k≤109). 

Output

For each test case, print a single line containing an integer, denoting the answer. 

Sample Input

2
1
2

Sample Output

5
7

这道题的关键是了解欧拉函数的性质,他是统计一个数与他互质的数的个数例如5有1,2,3,4四个数这道题试求一个数,与他互质的数的个数是不是一个合数,k代表说的是第几个这样的数与他互质的数的个数是合数。

这里考了欧拉函数的其中一个性质:

4是最小的合数,>=4的偶数都是合数。所以第一个数是5;由于6有两个1,5互质的数所以第二个是7,以后的只都为n+5;

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>

using namespace std;
typedef long long ll;
/*const ll maxn=1e7+10;
int oula(int n)
{
    int rea=n;
    for(int i=2; i*i<=n; i++)
        if(n%i==0)//第一次找到的必为素因子
        {
            rea=rea-rea/i;
            do
                n/=i;//把该素因子全部约掉
            while(n%i==0);
        }
    if(n>1)
        rea=rea-rea/n;
    return rea;
}*/

ll t;
int main()
{
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>t;
	while(t--){
		ll k;
		cin>>k;
		if(k==1)cout<<5<<endl;
		else cout<<k+5<<endl;
	}
 	return 0;
}

但一个数要求太大是他一定有简单的规律可以找到,要仔细分析题目找到其中的捷径。打击一起加油,这条路整的太长,太长,其中确实有意想不到的收获。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值