zoukankan      html  css  js  c++  java
  • HDU

    HDU - 5528 Count a * b

      照着这个写的,忘了哪个大佬博客里的了

      但很多初学者,像我一样可能不懂其中一些符号的意义,还有为什么可以这样推导,所以我自己又推导了一下,并用自己的观点解释了下一些自己不懂的过程。

      至于mod264,是因为中途计算结果可能超long long,所以注意使用unsigned long long 

     1 #include<cstdio>
     2 typedef unsigned long long ull;
     3 typedef long long ll;
     4 const int N=52118;
     5 bool nop[N]={false};
     6 int pn,pri[N];
     7 void initp()
     8 {
     9     pn=0;
    10     for(int i=2;i<N;i++)
    11     {
    12         if(!nop[i])
    13             pri[pn++]=i;
    14         for(int j=0;j<pn&&i*pri[j]<N;j++)
    15         {
    16             nop[i*pri[j]]=true;
    17             if(i%pri[j]==0)
    18                 break;
    19         }
    20     }
    21 }
    22 ull solve(int x)
    23 {
    24     ull ans1=1ull,ans2=1ull*x;
    25     for(int i=0;i<pn&&pri[i]*pri[i]<=x;i++)
    26     {
    27         if(x%pri[i]==0)
    28         {
    29             ll sum=1ll;
    30             int exp=0,p=1;
    31             while(x%pri[i]==0)
    32             {
    33                 p*=pri[i];
    34                 sum+=1ll*p*p;
    35                 x/=pri[i];
    36                 exp++;
    37             }
    38             ans1*=1ull*sum;
    39             ans2*=1ull*(exp+1);
    40         }
    41     }
    42     if(x>1)
    43     {
    44         ans1*=1ull*x*x+1;
    45         ans2*=2ull;
    46     }
    47     return ans1-ans2;
    48 }
    49 int main()
    50 {
    51     initp();
    52     int t,n;
    53     scanf("%d",&t);
    54     while(t--)
    55     {
    56         scanf("%d",&n);
    57         printf("%llu
    ",solve(n));
    58     }
    59     return 0;
    60 }
    项式分解
    #include<cstdio>
    typedef unsigned long long ull;
    const int N=52118;
    bool nop[N]={false};
    int pn,pri[N],pa,pp[N],exp[N];
    ull ans1,ans2;
    void initp()
    {
        pn=0;
        for(int i=2;i<N;i++)
        {
            if(!nop[i])
                pri[pn++]=i;
            for(int j=0;j<pn&&i*pri[j]<N;j++)
            {
                nop[i*pri[j]]=true;
                if(i%pri[j]==0)
                    break;
            }
        }
    }
    void getFac(int x)
    {
        pa=0;
        for(int i=0;i<pn&&pri[i]*pri[i]<=x;i++)
        {
            if(x%pri[i]==0)
            {
                pp[pa]=pri[i];
                exp[pa]=0;
                while(x%pri[i]==0)
                {
                    x/=pri[i];
                    exp[pa]++;
                }
                pa++;
            }
        }
        if(x>1)
        {
            pp[pa]=x;
            exp[pa++]=1;
        }
    }
    void dfs(int pos,int xx)
    {
        if(pos>=pa)
        {
            ans1+=1ull*xx*xx;
            return ;
        }
        dfs(pos+1,xx);
        for(int i=0,p=1;i<exp[pos];i++)
        {
            p*=pp[pos];
            dfs(pos+1,xx*p);
        }
    }
    ull solve(int x)
    {
        ans1=0ull;
        ans2=1ull*x;
        getFac(x);
        dfs(0,1);
        for(int i=0;i<pa;i++)
            ans2*=1ull*(exp[i]+1);
        return ans1-ans2;
    }
    int main()
    {
        initp();
        int t,n;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d",&n);
            printf("%llu
    ",solve(n));
        }
        return 0;
    }
    唯一分解
  • 相关阅读:
    SpringCloud学习(三)服务消费者(Feign)(Finchley版本)
    go爬虫系列
    SpringCloud学习(二)服务消费者(rest+ribbon)(Finchley版本)
    SpringCloud学习(一)服务的注册与发现Eureka(Finchley版本)
    JDK源码分析(11) ConcurrentLinkedQueue
    ServiceFabric极简文档-4.1 学习路线图
    ServiceFabric极简文档-4.0 开发环境搭建
    ServiceFabric极简文档-3. 发布脚本
    ServiceFabric极简文档-2 部署环境搭建-配置文件
    ServiceFabric极简文档-1.3删除群集
  • 原文地址:https://www.cnblogs.com/LMCC1108/p/11098527.html
Copyright © 2011-2022 走看看