Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define Max 1000000000000000000
- int num,K;
- map<int,int> cnt_PF;
- vector<int> PF_list;
- void find_divisors(int num){
- int i = 2;
- while(num%i == 0){
- if(cnt_PF[i] == 0){
- PF_list.push_back(i);
- }
- cnt_PF[i]++;
- num = num/i;
- }
- for(i = 3;i<=sqrt(num);i+=2){
- while(num%i == 0){
- if(cnt_PF[i] == 0){
- PF_list.push_back(i);
- }
- cnt_PF[i]++;
- num = num/i;
- }
- }
- if(num>2){
- if(cnt_PF[num] == 0){
- PF_list.push_back(num);
- }
- cnt_PF[num]++;
- }
- }
- void update_input(string s){
- string t = "";
- int len = s.length();
- for(int i = 0;i<len;i++){
- if(s[i] == '!') break;
- t = t.append(char2str(s[i]));
- }
- K = len - t.length();
- num = str2int(t);
- //printf("%d %d\n",num,K);
- }
- bool limit_crossed = false;
- long long calculate(){
- cnt_PF.clear();
- PF_list.clear();
- int c = 0,val;
- while(true){
- val = num - c*K;
- //printf("Checking %d\n",val);
- if(val <= 0) break;
- find_divisors(val);
- c++;
- }
- long long res = 1,cnt;
- int Size = PF_list.size();
- for(int i = 0;i<Size;i++){
- cnt = cnt_PF[PF_list[i]] + 1;
- //printf("Found pf %d for %d times\n",PF_list[i],cnt-1);
- res *= cnt;
- if(res > Max){
- limit_crossed = true;
- return res;
- }
- }
- return res;
- }
- int main(){
- string s;
- int nCase;
- cin >> nCase;
- for(int cs = 1;cs<=nCase;cs++){
- cin >> s;
- update_input(s);
- limit_crossed = false;
- long long res = calculate();
- if(limit_crossed == false){
- printf("Case %d: %lld\n",cs,res);
- }else{
- printf("Case %d: Infinity\n",cs);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment