2019牛オフ以上の学校9 I. KMとM(カテゴリユークリッド)

効果:M $は$ \合計\ limits_ {K = 1} ^ N \ {テキスト(KM)&M} $を求めて、$ Nを考えます

 

貢献$ Iはビット、明らかに$ \ lfloorの\のFRAC {KM} {2 ^ I}を考慮$ \ rfloor $奇数の数は$ 2 ^ i個の$乗算されます

それは$ 2 ^ Iに等しい(\和\ lfloor \ FRAC {KM} {^ I 2} \ rfloor-2 \和\ lfloor \ FRAC {KM} {2 ^ {I + 1}} \ rfloor)$を使用することができますヨーロッパは、決定されたクラスです

書式#include <iostreamの> 
の#include <sstream提供> 
する#include <アルゴリズム> 
書式#include <cstdioを> 
する#include <cmath> 
の#include <設定> 
書式#include <マップ> 
書式#include <キュー> 
の#include <文字列> 
の#include <CStringの> 
#include <ビットセット> 
の#include <機能> 
の#include <ランダム> 
の#define REP(I、N)のために(INT iは=、iが<= N; ++ I)
の#define PER(I、N )(I = N int型のために、私は> = A; - I)
の#defineのHRのputchar(10)
の#define PB一back 
の#define LC(O << 1)
の#define RC(LC | 1)
の#define中旬(( L + R)>> 1)
の#define LSのLC、L、中
の#define RSのRC、ミッド+ 1、R 
の#define X最初 
の#define Y秒
の#define IOのstd :: IOS :: sync_with_stdio(偽) 
の#define ENDL '\ N' 
の#define DB(A)({REP(__ I、1、n)はCOUT << [__ I] <<」「;時間。 })
名前空間stdを使用。
typedefの長い長いLL。
typedefのペア<int型、int型> PII。
CONST int型P = 1E9 + 7、INV2 =(P + 1)/ 2。
LLのGCD(-1,11,11- b)は{戻りB GCD(B、%のB):;} 
のLL qpow(-1,11,11- n)で{LLのR = 1%P;(%= Pのために、N ; = *%P、N >> = 1)であれば(N - 1)R = R *%のP、リターンR;} 
?LL INV(LL X){X <= 1を返す:INV(P%以下X)*(PP / X)%P;} 
インラインint型RD(){int型のx = 0; CHAR P = GETCHAR();一方、(P < '0' || P> '9')p = GETCHAR() ;一方、(P> = '0' && P <= '9')、X = X * 10 + P-'0' 、P = GETCHAR();戻りX;} 
//ヘッド
 
 
 
のint N、M。
INT {(LLのB、LLのC -1,11,11- n)を解く
    (場合!
    IF(A> = C || B> = C){
        INT、T =(%のC、Bの%のC、C、N)を解きます。N%= P。
        リターンさ(t +(A / C)%のP×n個%のP×(N + 1)%のP * INV2 +(B / C)%のP×(N + 1))%のP。
    } 
    LL M =((__int128)* N + B)/ C。
    リターン((N%P)*(M%P)-solve(C、CB-1、M-1))%のP。
} 
 
int型のmain(){ 
    LL N、M。
    CIN >> N >> M。
    int型ANS = 0; 
    REP(I、0,60)IF(M >> I&1){ 
        int型A =(M、0,1ll << I、n)を解きます。
        int型B =解く(M、0,1ll << I + 1、N)。
		INT C =(1LL << I)%のP。
        ANS =(ANS +(A-2LL * B)* C)%のP。
    } 
    IF(ANS <0)ANS + = P。
    printf( "%d個の\ n"、ANS)。
}

 

おすすめ

転載: www.cnblogs.com/uid001/p/11416582.html