标签:
2 2 2 10 10
Case 1: 1 Case 2: 2
#include <cstdio> #include <algorithm> using namespace std; typedef long long ll; const int all = (1e7)+1000; bool test[ all ]; int con[ 700000 ], spot; ll t, numk, numn, tmpk, tmpn, cnt, k, n; void make() { for( int i=2; i*i <= all; ++ i ){ if( test[ i*i ] == true ){ continue; } for( int j=i; i*j <= all; ++ j ){ test[ i*j ] = true; } } for( int i=2; i <= all; ++ i ){ if( ! test[ i ] ){ con[ spot ++ ] = i; } } } int main(void) { spot = 0; make(); scanf( "%d", &t ); for( int i=1; i <= t; ++ i ){ scanf( "%I64d%I64d", &n, &k ); printf( "Case %d: ", i ); cnt = 9223372036854775807; if( k == 1 ){ puts( "inf" ); continue; } // 利用 k 的缩小, 可以缩短计算量 // 注意 int 类型的范围, 这里需要进行 显式转换 成 long long 类型, 否则会溢出 for( int j=0; (ll)con[j]*con[j] <= k; ++ j ){ if( k % con[j] == 0 ){ numk = 0; while( k % con[j] == 0 ){ k /= con[j]; ++ numk; } // 计算 n!中 含有几个 con[j] 相乘 numn = 0; tmpn = n; while( tmpn ){ tmpn /= con[j]; numn += tmpn; } cnt = cnt < numn/numk ? cnt : numn/numk; } } // 存在当 con[j]*con[j] > k, 而又 k != 1 时, 所需要的计算 if( k != 1 ){ numn = 0; tmpn = n; while( tmpn ){ tmpn /= k; numn += tmpn; } cnt = cnt < numn ? cnt : numn; } printf( "%I64d\n", cnt ); } return 0; }
标签:
原文地址:http://www.cnblogs.com/seana/p/5263417.html