QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#764479#9479. And DNAL_WaveAC ✓0ms3972kbC++201.8kb2024-11-20 09:19:482024-11-20 09:19:53

Judging History

你现在查看的是最新测评结果

  • [2024-11-20 09:19:53]
  • 评测
  • 测评结果:AC
  • 用时:0ms
  • 内存:3972kb
  • [2024-11-20 09:19:48]
  • 提交

answer

// Problem: # 9479. And DNA
// Author: XZC(L_Wave)
// Language: Cpp/G++20
// Contest: 
// URL: https://qoj.ac/problem/9479
// Memory Limit: 1024 MB
// Time Limit: 1000 ms
// Create Time: not 2024-11-20 09:10:32, but 1926-08-17 11:45:14
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define rep(i, a, b) for (int i = (a), i##ABRACADABRA = (b); i <= i##ABRACADABRA; i++)
#define drep(i, a, b) for (int i = (a), i##ABRACADABRA = (b); i >= i##ABRACADABRA; i--)
using namespace std;
using ll = long long;
constexpr ll mod=998244353;
constexpr int N=3;
struct mat{
  ll a[N][N];
  mat(int _ty=0){_ty?idm():clr();}
  void clr(){memset(a,0,sizeof(a));}
  void idm(){clr();rep(i,0,N-1)a[i][i]=1;}
  void dbg()const{
    cout<<"-----------------------\n";
    rep(i,0,N-1)rep(j,0,N-1)cout<<a[i][j]<<" \n"[j==N-1];
    cout<<"-----------------------\n";
  }
  ll&g(int x,int y){return a[x][y];}
  ll g(int x,int y)const{return a[x][y];}
  friend mat operator*(mat x,mat y){
    mat z;
    rep(i,0,N-1)rep(k,0,N-1)rep(j,0,N-1)
      (z.a[i][j]+=1ll*x.a[i][k]*y.a[k][j]%mod)%=mod;
    return z;
  }
  friend mat operator^(mat x,ll y){
    mat z;
    z.idm();
    // 在矩阵无法得到合适的单位矩阵(如特定 (min,+) 矩阵等)时
    // 可以 --y,z=x,然后像正常一样做(y=0 不适用)
    for (;y;y>>=1){
      if (y&1)z=z*x;
      x=x*x;
    }
    return z;
  }
}A;

int n,m;
map<int,ll>res;

ll solve(int m){
  // cout<<m<<endl;
  if (res.count(m))return res[m];
  return res[m]=(m&1?res[1]*solve(m>>1):solve(m>>1)+solve((m>>1)-1))%mod;
}

int main() {
  scanf("%d%d",&n,&m);
  A.g(0,1)=1;
  A.g(0,2)=1;
  A.g(1,0)=1;
  A.g(2,1)=1;
  A=A^n;
  res[0]=1;
  res[1]=(A.g(0,0)+A.g(1,1)+A.g(2,2))%mod;
  printf("%lld\n",solve(m));
  return 0;
}

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 3924kb

input:

3 2

output:

4

result:

ok "4"

Test #2:

score: 0
Accepted
time: 0ms
memory: 3920kb

input:

3 0

output:

1

result:

ok "1"

Test #3:

score: 0
Accepted
time: 0ms
memory: 3784kb

input:

100 100

output:

343406454

result:

ok "343406454"

Test #4:

score: 0
Accepted
time: 0ms
memory: 3820kb

input:

686579306 119540831

output:

260602195

result:

ok "260602195"

Test #5:

score: 0
Accepted
time: 0ms
memory: 3924kb

input:

26855095 796233790

output:

492736984

result:

ok "492736984"

Test #6:

score: 0
Accepted
time: 0ms
memory: 3900kb

input:

295310488 262950628

output:

503008241

result:

ok "503008241"

Test #7:

score: 0
Accepted
time: 0ms
memory: 3912kb

input:

239670714 149827706

output:

994702969

result:

ok "994702969"

Test #8:

score: 0
Accepted
time: 0ms
memory: 3780kb

input:

790779949 110053353

output:

898252188

result:

ok "898252188"

Test #9:

score: 0
Accepted
time: 0ms
memory: 3844kb

input:

726600542 795285932

output:

183726777

result:

ok "183726777"

Test #10:

score: 0
Accepted
time: 0ms
memory: 3928kb

input:

957970519 585582861

output:

298814018

result:

ok "298814018"

Test #11:

score: 0
Accepted
time: 0ms
memory: 3824kb

input:

93349859 634036506

output:

110693443

result:

ok "110693443"

Test #12:

score: 0
Accepted
time: 0ms
memory: 3836kb

input:

453035113 34126396

output:

306244220

result:

ok "306244220"

Test #13:

score: 0
Accepted
time: 0ms
memory: 3968kb

input:

31994526 100604502

output:

930620701

result:

ok "930620701"

Test #14:

score: 0
Accepted
time: 0ms
memory: 3928kb

input:

234760741 249817734

output:

440195858

result:

ok "440195858"

Test #15:

score: 0
Accepted
time: 0ms
memory: 3828kb

input:

542621111 646412689

output:

207377992

result:

ok "207377992"

Test #16:

score: 0
Accepted
time: 0ms
memory: 3788kb

input:

28492783 602632297

output:

65234506

result:

ok "65234506"

Test #17:

score: 0
Accepted
time: 0ms
memory: 3788kb

input:

213500301 768820204

output:

540205113

result:

ok "540205113"

Test #18:

score: 0
Accepted
time: 0ms
memory: 3912kb

input:

697808101 753041955

output:

93561295

result:

ok "93561295"

Test #19:

score: 0
Accepted
time: 0ms
memory: 3928kb

input:

585126464 450455977

output:

91109717

result:

ok "91109717"

Test #20:

score: 0
Accepted
time: 0ms
memory: 3936kb

input:

236696315 482334538

output:

925575199

result:

ok "925575199"

Test #21:

score: 0
Accepted
time: 0ms
memory: 3912kb

input:

632719214 298704996

output:

358926097

result:

ok "358926097"

Test #22:

score: 0
Accepted
time: 0ms
memory: 3916kb

input:

869119333 933404114

output:

318501108

result:

ok "318501108"

Test #23:

score: 0
Accepted
time: 0ms
memory: 3972kb

input:

6977994 814763202

output:

585332987

result:

ok "585332987"

Test #24:

score: 0
Accepted
time: 0ms
memory: 3928kb

input:

3 1

output:

3

result:

ok "3"

Test #25:

score: 0
Accepted
time: 0ms
memory: 3844kb

input:

3 1000000000

output:

279679226

result:

ok "279679226"

Test #26:

score: 0
Accepted
time: 0ms
memory: 3844kb

input:

4 0

output:

1

result:

ok "1"

Test #27:

score: 0
Accepted
time: 0ms
memory: 3908kb

input:

4 1

output:

2

result:

ok "2"

Test #28:

score: 0
Accepted
time: 0ms
memory: 3828kb

input:

4 1000000000

output:

1755648

result:

ok "1755648"

Test #29:

score: 0
Accepted
time: 0ms
memory: 3824kb

input:

1000000000 0

output:

1

result:

ok "1"

Test #30:

score: 0
Accepted
time: 0ms
memory: 3896kb

input:

1000000000 1

output:

696798313

result:

ok "696798313"

Test #31:

score: 0
Accepted
time: 0ms
memory: 3912kb

input:

1000000000 1000000000

output:

703786301

result:

ok "703786301"

Extra Test:

score: 0
Extra Test Passed