P2054 [AHOI2005]シャッフル

P2054 [AHOI2005]シャッフリング
https://www.luogu.org/problem/P2054
現在のビート・コードがxは、その後シャッフリング後の位置がm倍(2 ^ m)である手の小さなプッシュデータ* X%(N + 1) ;
私たちは方程式群を解くために必要- >(M ^ 2)%* X(N-+ 1)== L
X = L×((2 ^ M)^ - 1)% (N + 1);
集合拡張ユーロ反転さが逃げるが、WA 2点__int128とともに変化

#include <iostreamの> 
する#include <cstdioを> 
する#include <キュー> 
の#include <アルゴリズム> 
の#include <cmath> 
の#include <CStringの>
 に#define INF 2147483647
 の#define N 1000010
 の#define P(A)のputchar(A)
 の#define(私は、A、B)のためには、(__ int128 iは=;私は= bを<; ++ i)に対する
 // 戦争によって
 // 2019年8月7日
使用して 名前空間はstdを、
__int128 N、M、L、X、Y。
ボイド (__int128&X){ 
    __int128のY = 1チャー C = GETCHAR(); X = 0 一方、(C < ' 0 ' || C> ' 9 '){ もし、(C == ' - ')Y = - 1 ; C = GETCHAR();}
     一方、(C <= ' 9 ' && C> = ' 0 '){X =(X << 1)+(X << 3)+ C- ' 0 ' ; C = GETCHAR();} 
    X * = Y。
} 
ボイドO(__ int128 x)から{
     場合(X < 0){P(' - 'X;}
     もし(X> 9)O(X / 10 )。
    P(Xの10 + ' 0 ' )。
} 
__int128 KSM(__ int128のA、__ int128 b)は{ 
    __int128のR = 1 一方、(B> 0 ){
         場合(B&1 
            R = R *%(nは+ 1 )。= A *%(N + 1 )。
        B >> = 1 
    } 
    戻りR。
} 

のボイドexgcd(__ int128のA、__ int128のB、__ int128&X、__ int128&Y){
     場合(!B){ 
        X = 1 ; Yは= 0 ;
        返します
    } 
    exgcd(B、 B、Y、X)。
    Y - = A / B * X。
} 

(){主符号付き
    (N)(M)。(L)
    Lの%= N + 1 
    exgcd(KSM(2、M)、N + 1 、X、Y)
    X =(Xの%(N + 1)+ N + 1)%(N + 1 )。
    O(X* 1%(N + 1 ))。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/war1111/p/11317301.html