may anyone put some tricky cases for this problem.
thanks.
this is my code that got WA:
Code: Select all
#include<iostream>
#include<stdio.h>
#include<map>
using namespace std;
long long MAX=1000000000;
long long devs[1002][25];
bool nums[1002];
int primes[1000];
int cnt;
map<int,int> facts[1001];
int counts[1002];
int main() {
MAX*=MAX;
int i,j,k,tt,n,t;
cnt=0;
nums[0]=nums[1]=false;
for(i=2;i<1002;i++)
nums[i]=true;
for(i=2;i<500;i++) {
if(nums[i]) {
for(j=i+i;j<1001;j+=i) {
for(tt=j,k=0;tt%i==0;tt/=i,k++);
facts[j].insert(pair<int,int>(i,k));
nums[j]=false;
}
facts[i].insert(pair<int,int>(i,1));
primes[cnt++]=i;
}
}
for(i=0;i<1001;i++)
for(j=0;j<25;j++)
devs[i][j]=0;
map<int,int>::iterator it;
cin>>n;
char temp[100];
string sss;
for(t=0;t<n;t++) {
cin>>i;
cin.getline(temp,100);
sss=temp;
j=sss.length();
if(devs[i][j]==0) {
if(j>0) {
for(k=0;primes[k]<=i&&k<cnt;k++)
counts[primes[k]]=0;
for(k=i;k>0;k-=j)
for(it=facts[k].begin();it!=facts[k].end();it++)
counts[it->first]+=it->second;
devs[i][j]=1;
for(k=0;k<cnt&&i>=primes[k];k++) {
if(counts[primes[k]])
devs[i][j]*=(counts[primes[k]]+1);
if(devs[i][j]>MAX) {
devs[i][j]=-1;
break;
}
}
}
else {
for(k=0;primes[k]<=i&&k<cnt;k++)
counts[primes[k]]=0;
for(it=facts[i].begin();it!=facts[i].end();it++)
counts[it->first]+=it->second;
devs[i][0]=1;
for(k=0;k<cnt&&i>=primes[k];k++) {
if(counts[primes[k]])
devs[i][0]*=(counts[primes[k]]+1);
if(devs[i][0]>MAX||devs[i][0]<0) {
devs[i][0]=-1;
break;
}
}
}
}
cout<<"Case "<<t+1<<": ";
if(devs[i][j]==-1)
cout<<"Infinity"<<endl;
else
cout<<devs[i][j]<<endl;
}
}