UVa 10139 Factovisors
2013-01-13 08:16
357 查看
这道题同样的代码用 JAVA 会超时,用 C++ 才通过。
#include <iostream> #include <vector> #include <cmath> using namespace std; // 素数筛的数组长度 long LEN = 1 << 16; // 用于保存筛出的素数 vector<long> primes; // 利用筛法求 2^16 以内的素数,保存到 primes 全局变量 void init() { bool filter[LEN]; for ( int i=0; i<LEN; i++ ) filter[i] = true; long max = (long)sqrt(LEN)+1; for ( int i=2; i<=max; i++ ) { if ( filter[i] ) { for ( int j=2*i; j<LEN; j+=i ) filter[j] = false; } } for ( int i=2; i<LEN; i++ ) if ( filter[i] ) { primes.push_back(i); } } // 计算素数 p ^ k 是否整除 n! bool divByP2Kth(long p, long k, long n) { if ( k==0 ) return true; long cnt = 0; for ( long i=p; i<=n; i*=p ) { cnt += n/i; if ( cnt >= k ) return true; } return false; } // 计算 m 是否整除 n! bool divide(long m, long n) { if ( m==0 ) return false; else if ( m== 1 ) return true; for ( unsigned int i=0; i<primes.size(); i++ ) { // 求 m 的素因数分解中素数 p 的指数 k long p = primes.at(i), k = 0; while ( m%p == 0 ) { k++; m /= p; } // p^k 是否整除 n! ? if ( ! divByP2Kth(p,k,n) ) return false; // 分解完毕 if ( m==1 ) break; } // 如果剩余一个大于 2^16 的素因子 if ( m>1 && ! divByP2Kth(m,1,n) ) return false; return true; } int main() { init(); long n, M; while (cin >> n >> M) { bool ok = divide(M,n); if ( ok ) { cout << M << " divides " << n << "!" << endl; } else { cout << M << " does not divide " << n << "!" << endl; } } return 0; }
相关文章推荐
- UVA 10139 Factovisors(数论)
- uva 10139 factovisors
- UVA 10139 Factovisors(数论)
- UVA 10139 Factovisors
- UVa 10139 Factovisors
- UVa Problem 10139 Factovisors (阶乘与整除)
- PC/UVa 题号: 110704/10139 Factovisors
- UVa 10139 - Factovisors
- UVa Problem Solution: 10139 - Factovisors
- UVa 10139 Factovisors (阶乘能否整除?)
- UVa-10139 Factovisors -(阶乘的整除)
- POJ2649 ZOJ1850 UVA10139 Factovisors【筛选法+勒让德定理】
- UVa 10139 - Factovisors
- [UVA10139]Factovisors(数论,质因数)
- 【 UVa 10139】 Factovisors 【 m | n!? 】
- Uva 10139
- UVA——10139(数论)(挑战编程题目)
- PC 的 110704 和 UVa 上的 10139 提交结果
- UVA 10139 判断n的阶乘能否被m整除
- uva 10139 求n的阶乘能否整除m