51nod-1363: 最小公倍數之和

來源:互聯網
上載者:User

標籤:void   lan   code   include   傳送門   cst   nod   個數   text   

【傳送門:51nod-1363】簡要題意:

  給出一個數n,求出1到n的數與n的最小公倍數的和

  多組資料

題解:

  理所當然推柿子

  原題相當於求$\sum_{i=1}^{n}\frac{i*n}{gcd(i,n)}$

  先枚舉d=gcd(i,n),然後化簡得到$$n*\sum_{d|n}\sum_{i=1}^{\frac{n}{d}}i[gcd(i,\frac{n}{d})==1]$$

  相當於求1到n-1中,與n互質的數和,設y<x,如果gcd(y,x)==1,那麼gcd(x-y,x)==1,兩式的貢獻就是x了

  所以1到n-1中,與n互質的數和為$\frac{\phi(n)*n}{2}$,特殊的,如果n=1,則數和為1

  那麼原式就等於$$n*\sum_{d|n且d不為n}\frac{\frac{n}{d}*\phi(\frac{n}{d})}{2}+1$$

  再化簡得到$$n+\frac{n}{2}\sum_{d|n且d>1}d*phi(d)$$

  這樣,這個式子就變成$O(\sqrt{n})$,但是多組資料仍會逾時

  實際上我們將n質因數分解得到$n=\prod_{i=1}^{x}p[i]^a[i]$

  因為p[i]兩兩互質,所以可以轉化為$$n+\prod_{i=1}^{x}\sum_{j=0}^{a[i]}\phi(p[i]^j)*p[i]^j$$

  根據歐拉函數的性質可以得到$$n+\prod_{i=1}^{x}1+\sum_{j=1}^{a[i]}(p[i]-1)*p[i]^{2j-1}$$

  再根據等比數列求和公式得到$$n+\prod_{i=1}^{x}1+(p[i]-1)*\frac{p[i]^{2*a[i]+1}-p[i]}{p[i]^2-1}$$

  $$n+\prod_{i=1}^{x}1+\frac{p[i]^{2*a[i]+1}-p[i]}{p[i]+1}$$

  然後線篩素數加速質因數分解就可以過了,記得最後處理1的情況

參考代碼:
#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<algorithm>using namespace std;typedef long long LL;LL Mod=1e9+7;int prime[110000],m,v[110000];void pre(int n){    m=0;    for(int i=2;i<=n;i++)    {        if(v[i]==0)        {            v[i]=i;            prime[++m]=i;        }        for(int j=1;j<=m;j++)        {            if(prime[j]>n/i||prime[j]>v[i]) break;            v[i*prime[j]]=prime[j];        }    }}LL p_mod(LL a,LL b){    LL ans=1;    while(b!=0)    {        if(b%2==1) ans=ans*a%Mod;        a=a*a%Mod;b/=2;    }    return ans;}int main(){    //freopen("a.in","r",stdin);    //freopen("a.out","w",stdout);    pre(100000);    int T;    scanf("%d",&T);    while(T--)    {        int n;        scanf("%d",&n);        LL ans=1,d=n;        for(int i=1;i<=m&&prime[i]<=n/prime[i];i++)        {            LL p=prime[i];            if(n%p==0)            {                LL s=0;                while(n%p==0) s++,n/=p;                ans=ans*(1+p*((p_mod(p,2LL*s)-1+Mod)%Mod)%Mod*p_mod(p+1,Mod-2)%Mod)%Mod;            }        }        ans=ans*(1+(LL)(n-1)*n%Mod)%Mod;        ans=(ans-1+Mod)%Mod;        printf("%lld\n",(ans*d%Mod*p_mod(2LL,Mod-2)%Mod+d)%Mod);    }    return 0;}
 

51nod-1363: 最小公倍數之和

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.