zoukankan      html  css  js  c++  java
  • 挖掘机技术哪家强---------------数论?

    挖掘机技术哪家强

    问题描述

      有人问现实中为什么总是男生追求女生,反过来很少。实际上女生也是想主 动追求男生的,但是世俗中对于主动追求男生的女生有种歧视,这样就使得女生 不大敢主动追求男生。但是面对喜欢的男生,难道就不出手么?女生只能步步为 营,挖坑来引诱男生往里跳。这时候问题就来了,挖掘机技术到底哪家强?被热血沸腾的广告洗脑了若干天后,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 的。

     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
    ",ans+1);
    47     }
    48     return 0;
    49 }
    代码
  • 相关阅读:
    e621. Activating a Keystroke When Any Child Component Has Focus
    e587. Filling Basic Shapes
    e591. Drawing Simple Text
    e595. Drawing an Image
    e586. Drawing Simple Shapes
    e636. Listening to All Key Events Before Delivery to Focused Component
    在 PL/SQL 块的哪部分可以对初始变量赋予新值? (选择1项)
    Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项)
    你判断下面语句,有什么作用?(单选)
    Oracle数据库表空间与数据文件的关系描述正确的是( )
  • 原文地址:https://www.cnblogs.com/wyher/p/9799872.html
Copyright © 2011-2022 走看看