[LightOJ1028]Trailing Zeroes (I)(拆分因子)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1028
思路:求一个数的所有因子数,结果-1…数据比较大,所以要加一步优化t < prime[i] * prime[i]的时候要退出。
1 #include <algorithm> 2 #include <iostream> 3 #include <iomanip> 4 #include <cstring> 5 #include <climits> 6 #include <complex> 7 #include <fstream> 8 #include <cassert> 9 #include <cstdio> 10 #include <bitset> 11 #include <vector> 12 #include <deque> 13 #include <queue> 14 #include <stack> 15 #include <ctime> 16 #include <set> 17 #include <map> 18 #include <cmath> 19 using namespace std; 20 #define fr first 21 #define sc second 22 #define cl clear 23 #define BUG puts("here!!!") 24 #define W(a) while(a--) 25 #define pb(a) push_back(a) 26 #define Rint(a) scanf("%d", &a) 27 #define Rll(a) scanf("%I64d", &a) 28 #define Rs(a) scanf("%s", a) 29 #define Cin(a) cin >> a 30 #define FRead() freopen("in", "r", stdin) 31 #define FWrite() freopen("out", "w", stdout) 32 #define Rep(i, len) for(int i = 0; i < (len); i++) 33 #define For(i, a, len) for(int i = (a); i < (len); i++) 34 #define Cls(a) memset((a), 0, sizeof(a)) 35 #define Clr(a, x) memset((a), (x), sizeof(a)) 36 #define Full(a) memset((a), 0x7f7f7f, sizeof(a)) 37 #define lrt rt << 1 38 #define rrt rt << 1 | 1 39 #define pi 3.14159265359 40 #define RT return 41 #define lowbit(x) x & (-x) 42 #define onecnt(x) __builtin_popcount(x) 43 typedef long long LL; 44 typedef long double LD; 45 typedef unsigned long long ULL; 46 typedef pair<int, int> pii; 47 typedef pair<string, int> psi; 48 typedef pair<LL, LL> pll; 49 typedef map<string, int> msi; 50 typedef vector<int> vi; 51 typedef vector<LL> vl; 52 typedef vector<vl> vvl; 53 typedef vector<bool> vb; 54 55 const int maxn = 1001000; 56 LL n; 57 LL prime[maxn], vis[maxn]; 58 int pcnt; 59 60 void init() { 61 pcnt = 0; Cls(vis); 62 for(LL i = 2; i < maxn; i++) { 63 if(!vis[i]) { 64 for(LL j = i * i; j < maxn; j+=i) 65 vis[j] = 1; 66 prime[pcnt++] = i; 67 } 68 } 69 } 70 71 LL factor(LL x) { 72 LL ret = 1; 73 LL t = x; 74 Rep(i, pcnt) { 75 if(t < prime[i] * prime[i]) break; 76 if(t % prime[i] == 0) { 77 int k = 0; 78 while(t % prime[i] == 0) { 79 t /= prime[i]; 80 k++; 81 } 82 ret *= (k + 1); 83 } 84 } 85 if(t > 1) ret *= 2; 86 return ret; 87 } 88 89 int main() { 90 // FRead(); 91 init(); 92 int T, _ = 1; 93 Rint(T); 94 W(T) { 95 printf("Case %d: ", _++); 96 cin >> n; 97 cout << factor(n) - 1 << endl; 98 } 99 }