题目描述
众所周知,卢本伟没有开挂,如何验证他没有开挂呢?这里我们发现一个算法通过输出d能够证明他有没有开挂
1:如果 n = 0,结束算法
2:find the smallest prime divisor dd of nn;
3:n减去d并且跳转到第一步
输入
仅包含一个整数n(2<=n<=10^10)
输出
仅输出一个整数,这个算法最后得到的操作的次数
样例输入
5
样例输出
1
分析:
本题看似简单,但是如果将素数打表或者直接判断都会时间超限。通过不断分析样例我们会发现一个偶数,他每次减去的素数都是2, 所减去的次数即是n/2;这是一个偶数的情况,那么一个奇数,我们会发现,他减去他所能整除的最小素数。那么就会变成偶数。所以可以通过这样来判断。然后特殊情况是当n=1 的时候。n=1 那么所减次数也是1次。
#include"stdio.h"
long long b[10001];
long long isprime(long long a)
{
long long i,j,k,t;
for(i=2;; i++)
{
if(a%i==0)
for(j=2; j<i; j++)
if(i%j==0)
break;
if(j==i)
return j;
}
}
int main()
{
long long n,i,d,j;
while(~scanf("%lld",&n))
{
d=0;
if(n%2==0)
{
d=n/2;
}
else
{
if(n==1)
d=1;
else if(n!=1)
{
n=n-isprime(n);
d=1+n/2;
}
}
printf("%lld\n",d);
}
}