Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<math.h>
- int Prime[(1<<23)+100];
- int pos[1<<24], PLEN;
- int flag[105];
- #define prime(i) ((Prime[i>>5])&(1<<(i&(31))))
- #define set(j) (Prime[j>>5]|=(1<<(j&(31))))
- #define LIM 100000007
- #define SLIM 10000
- int sieve()
- {
- int i, j,k,l,h;
- set(1);
- pos[0]=2;
- pos[1]=3;
- for(k=2,l=2,i=5; i<=SLIM; k++,i=3*k-(k&1)-1)
- if(prime(i)==0)
- {
- pos[l++]=i;
- for(j=i*i,h=!(k&1); j<=LIM; h=!h,j+=(1+h)*(i<<1))
- set(j);
- }
- i=3*k-(k&1)-1;
- for(; i<=LIM; k++,i=3*k-(k&1)-1)
- if(prime(i)==0)
- pos[l++] = i;
- PLEN=l;
- }
- int main()
- {
- int i, j, k, count, ans, flag, back, s,tmp,t;
- long long int prod, dsum, n;
- sieve();
- scanf("%d",&t);
- while(t--)
- {
- scanf("%lld",&n);
- flag=count=0;
- ans=1;dsum=1;
- back=n;
- s=sqrt(n);s++;
- for(i=0; pos[i]<=n&&pos[i]<=s; i++)
- {
- count=0;
- prod=1;
- while(n&&n%pos[i]==0)
- {
- n/=pos[i];
- count++;
- prod*=pos[i];
- }
- if(count)
- dsum=dsum*((prod*pos[i]-1)/(pos[i]-1));
- // printf("%lld\n",dsum);
- }
- if(n>1)
- dsum*=n+1;
- printf("%lld\n",dsum-back);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement