```
#include<bits/stdc++.h>
using namespace std;
**//driver program...**
int main(){
long long int T,N,i,j,K,arr[500001];
```

```
//precalculation...
for(i=1 ;i <= 500000;i++) arr[i]=1;
for(i=2;i<=708;i++)
for(j=2*i;j<=500000;j+=i)
arr[j]=(arr[j]*i)%10000;
```

```
scanf("%lld",&T);
while(T--){
scanf("%lld",&N);
if(N==1) printf("\n");
else if(arr[N]==0) printf("0000\n");
else printf("%lld\n",arr[N]);
}
return 0;
}
```

I guess your ‘ct’ array stands for number of divisors and you are counting all divisors so that you can answer each query as (total divisors/2) ^ N which takes O(log(n)) time per query and O(n*log(n)) pre-processing. Instead of increasing ‘ct’ by 1 everywhere, you can instead multiply it by i. Obviously this means you initialize ct as 1 for all elements. Also now you don’t have to care about square root stuff. Each query can be answered simply as ct[n] which is O(1) !

1 Like

@sumeet_varma …what should be ans for N==1??