[数論ブロック] BZOJ 1257との残部

説明

1 + K MOD 2 + K MOD正の整数n及びk、カルクJ(N、K)= K MODを与え3 + ... + MOD nはk個
k個のMOD iはiで割ったk個の余りを表します。
例如J(5,3)+ 3 + 0 3 3 + V 1、V 2 + V 3 3 + V 3 + V 4 3 5 = 0 + 1 + = 7 = 3

入力

二つの整数N、Kを含む入力ラインのみ。
1 <=はN、K <= 10 ^ 9

 

出力

出力のみ一列、すなわち、J(N、K)。

サンプル入力

5 3

サンプル出力

7

分析

$ \総和_ {i = 1} ^ NK \モッズ\ I $

N K-左\ lfloor \ FRAC {K} {I} \ \右\ rfloor I $易得$の\和_ {i = 1} ^

$ NK- \和_ {i = 1} ^ nは左\ lfloor \ FRAC {K} {I}を\ \右\ rfloor I $

間隔が同じ値で割り切れる需要があるため、ブロックが分割することができ

 

書式#include <iostreamの> 
の#include <cstdioを> 
する#include <cmath>
 使用して 名前空間はstd; 
typedefの長い 長いLL。
LL N、K、ANS。

INT メイン(){ 
    scanf関数(" %のLLDの%のLLD "、&​​N&K); ANS = N * K。
    (LL 1 = 1、R = 0、L <= N; L = R + 1 ){
         もし(K / L)R =分(N、K /(1 * K / L))。そうでなければ R = N。
        ANS - =(R-L + 1)*(L + R)*(K / L)>> 1 
    }
    printf(" %のLLD " 、ANS)。
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/mastervan/p/11367357.html