第二题:挖掘机技术哪家强
问题描述
有人问现实中为什么总是男生追求女生,反过来很少。实际上女生也是想主
动追求男生的,但是世俗中对于主动追求男生的女生有种歧视,这样就使得女生
不大敢主动追求男生。但是面对喜欢的男生,难道就不出手么?女生只能步步为
营,挖坑来引诱男生往里跳。这时候问题就来了,挖掘机技术到底哪家强?被热血
沸腾的广告洗脑了若干天后,Matt 终于下定决心,毅然登上了开往泉城的列车,
决心寻找生活的希望。
来到布鲁谢特学院后,Matt 逐渐地了解了各种型号的挖掘机。在这里我们
可以认为有大挖掘机和小挖掘机两种。
今天 Matt 的任务很简单:
首先他要用大挖掘机挖出恰好 N 单位体积的砂土。
由于小挖掘机比较笨拙,它每次挖的砂土体积是固定的。也就是说,设每次挖 x
单位体积砂土,那么 N 需要被 x 整除。在挖出若干堆体积为 x 的砂土后,Matt
需要计算 x 的“难挖指数”。体积 x 的“难挖指数”定义如下:对于某个不超
过 x 的体积 y,如果 x 与 y 的最大公约数为 1,那我们认为体积 y 是“难挖
的”,x 的“难挖指数”就要加上 y。
由于 Matt 之后还需要用小挖掘机处理被大挖掘机挖出的砂土,他希望知道
所有可能的 x 的难挖指数的和,这样他好估算今天要干多久,不然作为布鲁谢特
的高才生,他出门要被笑话的。
输入
第一行一个整数 T,表示数据组数。
接下来 T 行每行一个整数表示 N。
输出
对于每个数据输出一行一个整数表示难挖指数的和。
样例输入
3
2
3
4
样例输出
2
4
6
提示
【数据规模和约定】
对于 30%的数据有 T<=20,N<=10^4。
对于 60%的数据有 T<=100,N<=10^7。
对于 100%的数据有 1<=T<=1000,1<=N<=10^9。
设f(d)=1-d与d互质的数的和
题目意思:
求f(d|n)的和
结论:
1-n中与n互质的数的和=n*φ(n)/2
因为假如y与n互质 则n-y也与n互质 所以加起来就等于n了,y的个数就是φ(n),然后多加了一倍,就除以2
if(y|x)
φ(x*y)=φ(x)*y;
else
φ(x*y)=φ(x)*(y-1) (欧拉函数是积性函数)
void dfs(int x,long long y,long long z) { if(x>tot) { ans+=y*z/2;//ans就是答案 return; } dfs(x+1,y,z); int v=1; for(int i=1;i<=q[x];i++)//q[x]为n的第x个质因数的指数 { v*=p[x];//p[x]为n的第x个约数 if(i==1) dfs(x+1,y*v,z*(p[x]-1));//y里面没有 p[x]这个约数 else dfs(x+1,y*v,z*(p[x]-1)*(v/p[x]));//第一次是p[x]-1,其他的都是p[x] } }
具体思路:
1000组数据,又不能预处理,n=1e14,大概可以看出来是T*sqrt(n)的时间复杂度
然后题目要求的东西又和n的约数有关 那就差不多知道了要枚举n的约数,在计算答案
考虑到要计算n的所有约数的f(),所以就可以把n分解质因数,顺便就可以把φ()求出来
结束