Tarango

Count Prime Factor

Sep 4th, 2015
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.68 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define Max 1000000000000000000
  4.  
  5. int num,K;
  6. map<int,int> cnt_PF;
  7. vector<int> PF_list;
  8.  
  9. void find_divisors(int num){
  10.     int i = 2;
  11.     while(num%i == 0){
  12.         if(cnt_PF[i] == 0){
  13.             PF_list.push_back(i);
  14.         }
  15.         cnt_PF[i]++;
  16.         num = num/i;
  17.     }
  18.     for(i = 3;i<=sqrt(num);i+=2){
  19.         while(num%i == 0){
  20.             if(cnt_PF[i] == 0){
  21.                 PF_list.push_back(i);
  22.             }
  23.             cnt_PF[i]++;
  24.             num = num/i;
  25.         }
  26.     }
  27.     if(num>2){
  28.         if(cnt_PF[num] == 0){
  29.             PF_list.push_back(num);
  30.         }
  31.         cnt_PF[num]++;
  32.     }
  33. }
  34.  
  35. void update_input(string s){
  36.     string t = "";
  37.     int len = s.length();
  38.     for(int i = 0;i<len;i++){
  39.         if(s[i] == '!') break;
  40.         t = t.append(char2str(s[i]));
  41.     }
  42.     K = len - t.length();
  43.     num = str2int(t);
  44.     //printf("%d %d\n",num,K);
  45. }
  46.  
  47. bool limit_crossed = false;
  48.  
  49. long long calculate(){
  50.     cnt_PF.clear();
  51.     PF_list.clear();
  52.     int c = 0,val;
  53.     while(true){
  54.         val = num - c*K;
  55.         //printf("Checking %d\n",val);
  56.         if(val <= 0) break;
  57.         find_divisors(val);
  58.         c++;
  59.     }
  60.     long long res = 1,cnt;
  61.     int Size = PF_list.size();
  62.     for(int i = 0;i<Size;i++){
  63.         cnt = cnt_PF[PF_list[i]] + 1;
  64.         //printf("Found pf %d for %d times\n",PF_list[i],cnt-1);
  65.         res *= cnt;
  66.         if(res > Max){
  67.             limit_crossed = true;
  68.             return res;
  69.         }
  70.     }
  71.     return res;
  72. }
  73.  
  74. int main(){
  75.     string s;
  76.     int nCase;
  77.     cin >> nCase;
  78.     for(int cs = 1;cs<=nCase;cs++){
  79.         cin >> s;
  80.         update_input(s);
  81.         limit_crossed = false;
  82.         long long res = calculate();
  83.         if(limit_crossed == false){
  84.             printf("Case %d: %lld\n",cs,res);
  85.         }else{
  86.             printf("Case %d: Infinity\n",cs);
  87.         }
  88.     }
  89. }
Advertisement
Add Comment
Please, Sign In to add comment