当初遗留了很久的题目, 现在又翻出来了
曾经的想法就是把所有的操作1存起来,然后遇到操作二的时候遍历那些操作,是他的因子则加上熟练度 ,最后输出结果。
当初忘了考虑复杂度,那样下来复杂度还是偏高,
而后进行的优化就是去遍历因子, 把所有因子增加的熟练度加起来,最后输出结果,遍历因子要比遍历输入数据的复杂度要少的多。
代码如下:
#include<stdio.h>
#include<string.h>
#include<math.h>
const int M=1e6+5;
int num[M];
int add[M];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
memset(add,0,sizeof(add));
for(int i=1; i<=n; i++)
scanf("%d",&num[i]);
while(m--)
{
int t ;
scanf("%d",&t);
if(t==1)
{
int x,y;
scanf("%d%d",&x,&y);
add[x]+=y;
}
else
{
int j;
scanf("%d",&j);
int res=num[j];
int s=(int)sqrt((double)j);
for(int i=1; i<=s; i++)
if(j%i==0)
res+=add[i]+add[j/i];
if(s*s==j)
res-=add[s];
printf("%d\n",res);
}
}
}
return 0;
}