题意:如图所示,计算所有能与原点直接相连的点的个数
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2190
思路:用过观察发现可以利用筛选法进行求解,但是普通筛选因复杂度较高可能超时,故选择线性时间筛选法,套模板即可。
注意点:筛选法的选择,不考虑复杂度会超时。
以下为AC代码:
RunID | User | Problem | Result | Memory | Time | Language | Code_Length | Submit_Time |
749636 | luminous11 | 2190 | Accepted | 1584 kb | 40 ms | C++ | 1375 B | 2014-10-08 20:09:24 |
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <deque>
#include <list>
#include <cctype>
#include <algorithm>
#include <climits>
#include <queue>
#include <stack>
#include <cmath>
#include <set>
#include <iomanip>
#include <cstdlib>
#include <ctime>
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
long long num[40010] = { 0 };
long long solve ( long long n )
{
if ( n == 1 )
{
return 0;
}
for ( long long i = 2; i < 40010; i ++ )
{
if ( num[i] == 0 )
{
num[i] = i - 1;
for ( long long j = 2; j * i < 40010; j ++ )
{
if ( j % i == 0 )
{
num[i * j] = num[j] * i;
}
else
{
num[i * j] = num[j] * ( i - 1 );
}
}
}
}
long long ans = 3;
for ( long long i = 0; i < n; i ++ )
{
ans += num[i] * 2;
}
return ans;
}
int main()
{
long long a;
while ( cin >> a ) {memset ( num, 0, sizeof ( 0 ) );
cout << solve( a ) << endl;}
}