トピックリンク:
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、はsizeof(0 ))。 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); } }