彗星OJ - コンテスト#10 C-魚、大きなスプラッシュ(拡張GCD +暴力列挙)

トピックリンク:

https://www.cometoj.com/contest/65/problem/C

質問の意味:

最初のn個の項目と当該項目の最小値を検索し、フロントMOD NのXは0与えること等しいです

アイデア:

このような合同式等の残りの部分に関連付けられ、この式は、その後%X = 0、すなわち、(N + 1)* N%2X = 0、N / 2 *(N + 1)が発生するでしょう。もちろん、exgcd()需要関連の問題を考えます

方程式AX + NY =最小の正の整数解B 
ax≡b(mod n)を計算する原理を反転(合同式)
AXの+によって= GCD(A、B)(A、B溶液プライムのみ)

設けられたn + 1 = AP、N = BQ、 連立方程式を与える:QP - BQ = 1、古典的なユークリッド膨張問題の最小必要BQ溶液。
方程式は、溶液条件がGCD(A、B)== 1満たされなければならない有し 、 それは独特の分解定理の数によって分解され、そしてすべての素因数の積として全ての素数、すなわち取る力を満たすために。
コード:

#include <アルゴリズム> 
の#include <iostreamの> 
する#include <cstdioを> 
する#include <CStringの> 
する#include < ストリング > 
の#include <cmath>
 の#define IOS IOS :: sync_with_stdio(0)。cin.tie(0)。
#define make_pair融点
 の#defineは 0を受け入れ
 使用して 名前空間はstdを、
typedefの長い 長いLL。
typedefの符号なしの長い 長いULL。
typedefのペア < int型int型 > PII。
constの ダブルパイ= ACOS( - 1.0);
 のConst  ダブル ESP = 1E9 ;
 CONST  INT INF = 0x3f3f3f3f ;
 のconst  int型 MAXN = 1E5 + 7。;
 のconst  int型 MAXM = 1E6の+ 7。 CONST  INT MOD = 1E9 + 7。 CONST  INT MAXL = 1E6の+ 7。 

INT プリム[MAXL]。
 INT CNTは、
LL FACは[MAXL]; 
int型; VIS [MAXL]
 INT CUR; 
LL MX; // 素数力率の最大数

INT getPrime(){
     int型I、J。
    int型 CNT = 0 ; 
    memsetの(VIS、0はsizeof0 ))。
    VIS [ 0 ] = VIS [ 1 ] = 1 以下のための(I = 2 ; I <= MAXL; ++ I)
    { 
        場合(VIS [I]!)VIS [I] =プリム[CNT ++] = I。
        ため(J = 0 ; J <CNT && iがプリム[j]を* <= MAXL; ++ J){ 
            VIS [iが *プリム[J] = 1 もし(I%プリム[J] == 0ブレーク
        } 
    }
    リターンCNT; 
} 
のLL exgcd(-1,11,11-のB、LL&X、LL&Y){
     場合(Bの== 0 
    { 
        X = 1 
        Y = 0 返します
    } 
    のLL D = exgcd(B、%のB、x、y)は、温度= X。
    X = Y。
    Y = TEMP-A / Bの*のY;
    リターンD; 
} 
INT getFactor(LL N、int型CNT){
     int型 CUR = 0 以下のためのint型i = 0 ; iは、CNT <; iは++ ){
         場合(N == 1ブレークもし(N%プリム[I] == 0 ){ 
            FAC [CUR] = 1 一方、(N [I] ==%プリム0 ){ 
                N / = [I]プリム。
                FAC [CUR] * = プリム[i]は、
            } 
            CUR ++ 
            MX = MAX(MX、FAC [CUR])。
        } 
    } 
    もし、(N> 1)FAC [CUR ++] = N。リターンCURは; 
} 

(N-LL){解決LL 
        LL ANS = N - << 1。;
     // 可能な組成物の複数のので互いに素素因数がある
    ためINT I = 1。私は(<; 1。 <<(CUR))は、Iを++ ){ 
        LL A = 1 、B;
         のためのINT J = 0 ; J <(CUR); J ++ ){
             IF(I&(1 << J))A * = FAC [J]; 
        } 
        B = 2 * N- / ; 
        LL X、Y、
        exgcd(A、B、X、Y); 
        ANS=分(ANS、分( - ((X%のB + B)%のBB)*、 - ((Y%A + A)%のAA)* b)参照)。
//         exgcd(A、B、X、Y)。
//         LL XX = X、YY = Y。
//         場合(X> 0){
 //             X = XX%のB;
//             Y + =(XX-X)/ B *。
//         }他{
 //             Y = YY%。
//             X + =(YY-Y)/ * Bと、
//         }
 //         ANS =分(ANS、分(ABS(* x)から、ABS(b *表Y)))。    
    }
     戻りANS。
} 
int型のmain(){
     int型のT。
    CNT = getPrime()。
    CIN >>T;
     // 設定X + 1 = AP、X = BQ; BQ =利用可能な1-AP;
     // 最小溶液BQを評価し、exgcd(); 
    一方(T-- ){ 
        LL N-; scanfの(" %のLLD "N-); 
        N- << = 1 ; 
        CUR = getFactor(N、CNT); 
        LL ANS =(N /解決2 ); 
        のprintf(" %のLLDの\のN- " 、ANS); 
    } 
}

 

おすすめ

転載: www.cnblogs.com/Tianwell/p/11482380.html