BZOJ 3561:DZYは数学VI +メビウス反転複雑分析を愛しています

それから、行かないプッシュを形成することではないでしょう押し込ん〜 

問題の愚かな解決を見た後:私は右のプッシュにした何の押し上げがないので、プッシュが行くことではありません。 

複雑さは偉大に見えるが、実際には$ O(n)を$償却され、ああ、分析の複雑さが能であることが表示されます 

コード: 

#include <ビット/ STDC ++。H>  
#define LL長い長いです 
#define N 500006   
#defineモッズ十億七    
#define setIO(S)freopenは(S ".IN"、 "R"、標準入力)      
名前空間stdを使用。 
int型CNT; 
INT MU [N]、VIS [N]、第[N]。   
(あなたは、Xあなたy)はあなたをqpow 
{
    int型TMP = 1;  
    一方、(Y) 
    {
        もし(Y&1)TMP =(LL)TMP * X%のMOD。  
        X =(LL)X * X%のMOD。 
        Y >> = 1。 
    } 
    tmpに返します。 
}  
空の初期化() 
{   
    私は、jはint型。  
    MU [1] = 1。 
    (; I <N; ++ I I = 2)のための  
    {
        もしプライム[++ CNT] = I、ミュー[I] =  -  1(VIS [i]が!)。 
        用(J = 1; J <= CNT &&プライム[J] * I <N; ++ j)は 
        {
            ビュー[プライム*で[J] = 1;   
            (I%プライム[J])の場合 
            {  
                ミュー[*最初の[J] =  - ムー[i]は、   
            } 
            {
                ミュー[私が総理* [J] = 0; 
                ブレーク;  
            }
        }
    }
} 
整数N、M。 
[N]、合計INT [N]。    
INT年= 0; 
メインint型() 
{  
    私は、jはint型。  
    // setIO( "入力");  
    初期化();   
    scanf関数( "%D%D"、&N、&M)。 
    (N> M)スワップ(N、M)の場合、   
    以下のための式(I = 1; I <= M; ++ I)[I] = 1。 
    用(int型、D = 1; D <= N; ++ D) 
    {
        (; I <= M / D; ++ iは= 1)のための 
        {
            [I] =(LL)[I] * I%のMOD。 
            和[I] =(LL)(和[I-1] + [I])%のMOD。   
        }  
        int型TMP = 0;  
        (C ++; C <= N / D INT C = 1)のために 
        {
            TMP =(LL)(TMP +(LL)MU [C] * qpow(C、2 * D)%のMOD *和[N / D / C]%MOD *和[M / D / C]%MOD + MOD) %モッズ;    
        }
        ANS =(LL)(ANS +(LL)qpow(D、D)* TMP%MOD)%のMOD。   
    }
    printf( "%dの\ n" は、ANS)。  
    0を返します。 
}

  

おすすめ

転載: www.cnblogs.com/guangheli/p/12056395.html