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 ; }