挖掘机技术哪家强---------------数论?
挖掘机技术哪家强
问题描述
有人问现实中为什么总是男生追求女生,反过来很少。实际上女生也是想主 动追求男生的,但是世俗中对于主动追求男生的女生有种歧视,这样就使得女生 不大敢主动追求男生。但是面对喜欢的男生,难道就不出手么?女生只能步步为 营,挖坑来引诱男生往里跳。这时候问题就来了,挖掘机技术到底哪家强?被热血沸腾的广告洗脑了若干天后,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^3
对于 60%的数据有 T<=100,N<=10^7。
对于 100%的数据有 1<=T<=1000,1<=N<=10^9。
30% 暴力
我们采用无脑枚举,就有30分了。
60%。。。100%
1.一个数的因数个数不会超过2√n。
2.小于N且与N互质的数的和为φ(N)*N / 2。
如果知道了这个结论的话就会发现 暴搜就可以了!。
我们只需要在√N的时间将N质因数分解。然后就可以 dfs 出 N 的所有因数了,另外在暴搜的过程中我们还可以顺便求出φ(N)。
于是时间复杂度是T√N 的。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 int n,x,y,pre; 5 int t[50],top; 6 int tot[50]; 7 ll ans,tmp; 8 void dfs(int u,ll sum,ll now) 9 { 10 if(u>top) 11 { 12 ans+=(now*sum>>1); 13 return ; 14 } 15 dfs(u+1,sum,now); 16 for(int i=1;i<=tot[u];++i) 17 { 18 now*=t[u]; 19 sum*=t[u]; 20 dfs(u+1,sum,now/t[u]*(t[u]-1)); 21 } 22 } 23 int main() 24 { 25 scanf("%d",&n); 26 while(n--) 27 { 28 scanf("%d",&x); 29 top=0;y=sqrt(x);ans=0; 30 for(int i=2;i<=y;++i) 31 if(x%i==0) 32 { 33 t[++top]=i;tot[top]=0; 34 while(x%i==0) 35 { 36 ++tot[top]; 37 x/=i; 38 } 39 } 40 if(x>1) 41 { 42 t[++top]=x; 43 tot[top]=1; 44 } 45 dfs(1,1,1); 46 printf("%lld\n",ans+1); 47 } 48 return 0; 49 }