Editorial for Xếp hình
Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.
Submitting an official solution before solving the problem yourself is a bannable offence.
Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này
Code mẫu của flashmt
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> using namespace std; long long base; struct matrix { long long a[6][6]; void load(int x) { x%=base; a[0][0]=a[1][2]=a[2][0]=a[2][1]=a[4][5]=1; a[3][3]=a[5][4]=base-1; a[3][0]=-4LL*x; while (a[3][0]<0) a[3][0]+=base; a[3][1]=a[3][0]; a[1][0]=a[1][1]=4LL*x*x%base; a[1][3]=a[4][4]=2LL*x%base; } void multiply(matrix x,matrix y) { memset(a,0,sizeof(a)); for (int i=0;i<6;i++) for (int j=0;j<6;j++) for (int k=0;k<6;k++) a[i][j]=(a[i][j]+x.a[i][k]*y.a[k][j])%base; } }; matrix m[33],u; long long ans[6]; void multi(long long a[],matrix m) { long long b[6]={0}; for (int j=0;j<6;j++) for (int i=0;i<6;i++) b[j]=(b[j]+a[i]*m.a[i][j])%base; for (int i=0;i<6;i++) a[i]=b[i]; }; int main() { int test,x,n,i; cin >> test; while (test--) { cin >> x >> n >> base; if (base==1) { puts("0"); continue; } n-=2; m[0].load(x); for (i=1;1<<i<=n;i++) m[i].multiply(m[i-1],m[i-1]); ans[1]=1LL*x*x%base; ans[0]=ans[1]+1; ans[3]=ans[4]=x%base; ans[2]=ans[5]=1; while (n) { --i; if (1<<i<=n) n-=1<<i, multi(ans,m[i]); } cout << ans[0] << endl; } }
Code mẫu của happyboy99x
#include<cstdio> #include<cstring> const long long base[4][4] = {{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}}; int n, mod; long long a[4][4]; struct Matrix { long long a[4][4]; Matrix() { for(int i = 0; i < 4; ++i) for(int j = 0; j < 4; ++j) a[i][j] = 0; } Matrix(const long long a[4][4]) { for(int i = 0; i < 4; ++i) for(int j = 0; j < 4; ++j) this->a[i][j] = a[i][j]; } void operator *= (const Matrix &mat) { Matrix res; for(int i = 0; i < 4; ++i) for(int j = 0; j < 4; ++j) for(int k = 0; k < 4; ++k) res.a[i][j] = (res.a[i][j] + a[i][k] * mat.a[k][j]) % mod; *this = res; } Matrix operator ^ (const int &n) { Matrix res = Matrix(base), now = *this; for(int i = n; i != 0; i >>= 1) { if(i & 1) res *= now; now *= now; } return res; } }; int main() { int tc; scanf("%d", &tc); while(tc--) { int a2; scanf("%d%d%d", &a2, &n, &mod); memset(a, 0, sizeof a); a[0][0] = a[1][2] = a[2][0] = a[2][1] = 1; a[2][2] = 4LL * a2 * a2 % mod; a[2][3] = 2LL * a2 % mod; a[3][2] = -4LL * a2 % mod; a[3][3] = -1; Matrix res = Matrix(a) ^ (n-1); printf("%lld\n", (((res.a[0][0] + res.a[1][0] + res.a[2][0] * a2 % mod * a2 % mod + res.a[3][0] * a2) % mod) + mod) % mod); } return 0; }
Code mẫu của ladpro98
program FBRICK; uses math; const fi = ''; fo = ''; type arr = array[1..6,1..6] of int64; var s, c: arr; Q:array[1..6] of int64; n, m , k, res, kk: int64; t, tt, i: longint; inp, oup:text; operator *(a,b: arr) c: arr; var i,j,k:longint; begin for i:=1 to 6 do for j:=1 to 6 do begin C[i,j] := 0; for k:=1 to 6 do begin C[i,j] := (C[i,j] + a[i,k]*b[k,j]) mod M; end; if c[i,j] < 0 then inc(c[i,j], m); end; end; function Pow(p: longint): arr; var t: arr; begin if p = 1 then exit(S); t := Pow(p shr 1); t := t * t; if odd(p) then exit(t * S); exit(t); end; begin assign(inp,fi);reset(inp); assign(oup,fo);rewrite(oup); readln(inp,t); for tt:=1 to t do begin readln(inp,kk,n,m); k := 2*kk mod m; Q[1] := 1; Q[2] := kk*kk mod m; Q[3] := 1; Q[4] := kk; Q[5] := kk; Q[6] := 1; S[1,1] := 1; S[1,2] := 1; S[2,2] := k*k mod m; S[2,3] := 1; S[2,4] := -2*k; S[3,2] := 1; S[4,2] := k; S[4,4] := -1; S[5,5] := k; S[5,6] := -1; S[6,5] := 1; C := Pow(n-1); res := 0; for i:=1 to 6 do begin res := (res + Q[i] * C[1,i]) mod M; //if res < 0 then inc(res, m); end; writeln(oup,res); end; close(oup); end.
Code mẫu của RR
#include <stdio.h> #include <string.h> #include <stdlib.h> #define FOR(i,a,b) for(i=(a); i<=(b); i++) #define REP(i,a) for(i=0; i<(a); i++) #define ll long long int base, a, n; int m[2][16], p[32][16]; int INP,AM; #define BUFSIZE (1<<12) char BUF[BUFSIZE+1], *inp=BUF; #define GETCHAR(INP) { \ if(!*inp) { \ if (feof(stdin)) memset(BUF, 0, sizeof BUF); else fread(BUF,1,BUFSIZE,stdin); \ inp=BUF; \ } \ INP=*inp++; \ } #define DIG(a) (((a)>='0')&&((a)<='9')) #define GN(j) { \ AM=0;\ GETCHAR(INP); while(!DIG(INP) && INP!='-') GETCHAR(INP);\ if (INP=='-') {AM=1;GETCHAR(INP);} \ j=INP-'0'; GETCHAR(INP); \ while(DIG(INP)){j=10*j+(INP-'0');GETCHAR(INP);} \ if (AM) j=-j;\ } int main() { // freopen("tow1.in", "r", stdin); // freopen("output.txt", "w", stdout); int ntest; GN(ntest); int need, i, j, u, v, k, b1, b2, c2, s2, cur, t; while (ntest--) { GN(a); GN(n); GN(base); b1 = 1, b2 = (a * (ll)a) % base; c2 = a, s2 = (b1 + b2) % base; p[0][0] = p[0][5] = p[0][10] = p[0][15] = 1; p[1][1] = 1; p[1][4] = 1; p[1][5] = ((4 * (ll) a) % base * a) % base; p[1][6] = base - (4 * (ll) a) % base; p[1][9] = (2*a) % base; p[1][10] = (base - 1); p[1][12] = 1; p[1][13] = ((4 * (ll) a) % base * a) % base; p[1][14] = base - (4 * (ll) a) % base; p[1][15] = 1; need = n-2; REP(i,16) m[0][i] = p[0][i]; cur = 0, t = 0; while ((1<<t) < need) t++; t++; FOR(i,1,t) { if (i >= 2) { REP(k,16) { p[i][k] = 0; for(u = k - (k&3), v = (k&3); v < 16; u++, v+=4) { p[i][k] += (p[i-1][u] * (ll)p[i-1][v]) % base; if (p[i][k] >= base) p[i][k] -= base; } } } if ((need >> (i-1)) & 1) { REP(k,16) { m[1-cur][k] = 0; for(u = k - (k&3), v = (k&3); v < 16; u++, v+=4) { m[1-cur][k] += (m[cur][u] * (ll)p[i][v]) % base; if (m[1-cur][k] >= base) m[1-cur][k] -= base; } } cur = 1 - cur; } } int res = ((m[cur][12] * (ll) b1 + m[cur][13] * (ll) b2) % base + (m[cur][14] * (ll) c2 + m[cur][15] * (ll) s2) % base) % base; printf("%d\n", (int) res); } return 0; }
Code mẫu của hieult
#include<cstdio> #include<cmath> #include<math.h> #include<cstring> #include<cstdlib> #include<cassert> #include<ctime> #include<algorithm> #include<iterator> #include<iostream> #include<cctype> #include<string> #include<vector> #include<map> #include<set> #include<queue> #include<sstream> #include<list> #define fi first #define se second #define PB push_back #define MP make_pair #define ep 0.00001 #define oo 111111111 //#define mod 1000000009 #define TR(c, it) for(typeof((c).begin()) it=(c).begin(); it!=(c).end(); it++) #define rep(i, n) for(int i = 0; i < n; i++) #define FOR(i, a, b) for(int i = a; i <= b; i++) #define FORD(i, a, b) for(int i = a; i >= b; i--) #define MS(a, x) memset(a, x, sizeof(a)) #define SZ(a) (int)(a.size()) //#define g 9.81 double const PI=4*atan(1.0); using namespace std; typedef pair<int, int> II; typedef vector<int> VI; typedef vector<II> VII; typedef vector<VI> VVI; typedef vector<VII> VVII; typedef long long ll; const int max_size = 4; ll mod; struct Matrix{ ll x[max_size][max_size]; Matrix(){}; Matrix(int d){ MS(x, 0); rep(i, max_size) x[i][i] = d; }; Matrix(ll const a[max_size][max_size]) { for(int i = 0; i < max_size; i++) for(int j = 0; j < max_size; j++) x[i][j] = a[i][j];} friend Matrix operator * (const Matrix &a, const Matrix &b){ Matrix c; for(int i = 0; i < max_size; i++) for(int j = 0; j < max_size; j++){ c.x[i][j] = 0; for(int k = 0; k < max_size; k++) c.x[i][j] = (c.x[i][j] + a.x[i][k] * b.x[k][j]) % mod; } return c; } friend Matrix operator ^ (const Matrix &a,const int &k){ Matrix base; rep(i, max_size) rep(j, max_size) base.x[i][j] = a.x[i][j]; Matrix res = Matrix(1); int p = k; while (p > 0) { if (p & 1) { res = res * base; } p >>= 1; base = base * base; } return res; } void print(){ for(int i = 0; i < max_size; i++){ for(int j = 0; j < max_size; j++) printf("%lld ",x[i][j]); printf("\n"); } } }; int test; ll x, k, n, m, a[5], f[5]; int main(){ //freopen("input.in","r",stdin); //freopen("output.out","w",stdout); cin >> test; while(test --){ cin >> x >> n >> mod; x %= mod; a[1] = 1 % mod; f[1] = a[1]; a[2] = x ; f[2] = (a[1] * a[1] + a[2] * a[2]) %mod; for(int i = 3; i <= 4; i++) { a[i] =( 2 * x * a[i - 1] - a[i - 2]) % mod; f[i] = (f[i - 1] + a[i] * a[i]) % mod; } if(n < 5) cout<<f[n]<<endl; else { k = (4 * x * x - 1) % mod; ll u[4][4] = { (k + 1) % mod , 1, 0, 0, mod - ((2 * k) % mod), 0, 1, 0, (k + 1) % mod, 0, 0, 1, mod - 1, 0, 0, 0}; Matrix A = Matrix(u); A = A ^ (n - 4); long long kq = 0; for(int i = 0; i < 4; i++) kq = (kq + f[4 - i] * A.x[i][0]) % mod; cout << kq << endl; } } // getch(); }
Code mẫu của skyvn97
#include<cstdio> typedef long long ll; struct matrix { int m,n; ll d[10][10]; }; int n; ll a2; ll mod; matrix fst,mul; matrix multi(const matrix &a,const matrix &b) { int i,j,k; int x=a.m; int y=a.n; int z=b.n; matrix c; c.m=x;c.n=z; for (i=0;i<x;i=i+1) for (j=0;j<z;j=j+1) { c.d[i][j]=0; for (k=0;k<y;k=k+1) c.d[i][j]=(c.d[i][j]+a.d[i][k]*b.d[k][j])%mod; } return (c); } matrix multiply(const matrix &a,const int &k) { if (k==1) return (a); matrix r=multiply(a,k/2); r=multi(r,r); if (k%2==1) r=multi(r,a); return (r); } void process(void) { scanf("%lld",&a2); scanf("%d",&n); scanf("%lld",&mod); if (mod==1) { printf("0\n"); return; } mul.m=4; mul.n=4; mul.d[0][0]=1; mul.d[0][1]=0; mul.d[0][2]=0; mul.d[0][3]=0; mul.d[1][0]=(4*a2*a2)%mod; mul.d[1][1]=(4*a2*a2)%mod; mul.d[1][2]=1; mul.d[1][3]=(2*a2)%mod; mul.d[2][0]=1; mul.d[2][1]=1; mul.d[2][2]=0; mul.d[2][3]=0; mul.d[3][0]=(-4*a2)%mod+mod; mul.d[3][1]=(-4*a2)%mod+mod; mul.d[3][2]=0; mul.d[3][3]=mod-1; fst.m=1; fst.n=4; fst.d[0][0]=(1+a2*a2)%mod; fst.d[0][1]=(a2*a2)%mod; fst.d[0][2]=1; fst.d[0][3]=a2%mod; if (n>2) fst=multi(fst,multiply(mul,n-2)); if (fst.d[0][0]<0) fst.d[0][0]+=mod; printf("%lld\n",fst.d[0][0]); } int main(void) { int t,c; scanf("%d",&t); for (c=1;c<=t;c=c+1) process(); return 0; }
Comments