p2286_数论dp.cpp

来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· C++ 代码 · 共 39 行

CPP
39
字号
#include <stdio.h>
#include <string.h>
#define  MaxN     1000001

unsigned int Num [MaxN] , Prime [MaxN] , Sum [3392929];

void     prepare ()
{
         memset ( Prime , 0 , sizeof ( Prime ));
         memset ( Sum , 0 , sizeof ( Sum ));
         Prime [1] = 1;
         for ( int i = 2; i < MaxN; i ++ ) if ( Prime [i] == 0 )
             for ( int j = i; j < MaxN; j += i ) Prime [j] = i;
         int t , q , tmp , ti;
         Num [1] = 1;
         int Max = 0;
         for ( int i = 2; i < MaxN; i ++ ) {
             for ( q = Prime [i] , tmp = 1 , ti = i , t = Prime [i]; ti % t == 0; ti /= t , q *= t )
                 tmp += q;
             Num [i] = Num [ti] * tmp;
             Sum [Num [i] - i ] ++;
         }
         Sum [0] = 1;
         for ( int i = 1; i < 3392929; i ++ ) Sum [i] += Sum [i - 1];
}

main ()
{
     prepare ();
     int     N;
     while ( scanf ( "%d" , &N ) != EOF ) {
           if ( N > 3392928 ) {
                printf ( "1000000\n" );
                continue;
           }
           printf ( "%d\n" , Sum [N] );
     }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?