果然见的不多闻的不广啊,连欧拉函数都不知道。hdoj 1286的题目都LTE了
// 2013-03-30 Time Limit Exceeded1286 1000MS588K796 BG++
#include<cstdio>
using namespace std;
int gcd(int m, int n)
{
if(m < n)
{
int tmp = m;
m = n;
n = tmp;
return gcd(m, n);
}
else if(m == n)
{
return m;
}
else
{
if(!(m % n))
{
return n;
}
return gcd(m-n, n);
}
}
int main()
{
int N, num, cnt;
//freopen("in.txt", "r", stdin);
while(scanf("%d", &N) == 1)
{
for(int tmp = 0; tmp < N; ++tmp)
{
cnt = 0;
scanf("%d", &num);
for(int i = 2; i < num; ++i)
{
if(gcd(num, i) > 1)
{
++cnt;
}
}
printf("%d\n", num - cnt - 1);
}
}
return 0;
}
以下是正确的代码
7938779 | 2013-03-30 20:44:21 | Accepted | 1286 | 0MS | 200K | G++ | 暂时隐藏 |
#include<cstdio>
using namespace std;
int euler(int arg)
{
int ans = arg;
for(int tmp = 2; tmp * tmp <= arg; ++tmp)
{
if(!(arg % tmp))
{
ans = ans * (tmp-1) / tmp; //用*=会因为整数除的问题出错
while(!(arg % tmp))
{
arg /= tmp;
}
}
}
if(arg > 1)
{
ans = ans * (arg-1)/arg;
}
return ans;
}
int main()
{
//freopen("in.txt", "r", stdin);
int N, num;
while(scanf("%d", &N)==1)
{
for(int i = 0; i<N; ++i)
{
scanf("%d", &num);
printf("%d\n", euler(num));
}
}
return 0;
}
以后要多写写博客啊,虽然更喜欢用evernote保存起来,写出来share总觉得有点麻烦。以后总得用github写写博客才好。