#include<stdio.h>//心累,感觉没法优化了...... #include<math.h> int a[500010]; void wap(); int main() { int n,x; wap(); scanf("%d",&n); while(n--) { scanf("%d",&x); printf("%d\n",a[x]); } } void wap() { int i,j,s; for(i=2;i<500008;i++) { for(s=0,j=2;j<=sqrt(i);j++) { if(i%j==0) { s=s+j+i/j; if(j==sqrt(i)) s=s-i; } } a[i]=s+1; } }
//因为这里的数字比较大,所以你能进行太大的运算,只能用+ -法.. //用好多方法都超时,最后看了别人的微博,看到了这个办法. //这个办法和那个闰年生日,用的是一个原理. //下次一定要注意 #include<stdio.h> int a[500010]; void wap(); int main() { int t,n; wap(); scanf("%d",&t); while(t--) { scanf("%d",&n); printf("%d\n",a[n]); } return 0; } void wap() { int i,j; for(i=1;i<=500008/2;i++) { for(j=2*i;j<500008;j=j+i) { a[j]=a[j]+i; } } }
时间: 2024-10-19 09:43:54