BZOJ 2190 [SDOI2008]仪仗队

来源:互联网 发布:程序员眼镜 编辑:程序博客网 时间:2024/04/30 09:04

题意:如图所示,计算所有能与原点直接相连的点的个数

链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2190

思路:用过观察发现可以利用筛选法进行求解,但是普通筛选因复杂度较高可能超时,故选择线性时间筛选法,套模板即可。

注意点:筛选法的选择,不考虑复杂度会超时。

以下为AC代码:

RunIDUserProblemResultMemoryTimeLanguageCode_LengthSubmit_Time749636luminous112190Accepted1584 kb40 msC++1375 B2014-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;} }



0 0
原创粉丝点击