QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#250084 | #7620. Yet Another Subsequence Problem | ucup-team2307 | WA | 1ms | 3408kb | C++20 | 2.5kb | 2023-11-12 21:13:50 | 2023-11-12 21:13:51 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int ll
const int MOD=998244353;
#if 1
using row=array<int,3>;
using matr=array<row,3>;
const matr ONE={
row{1,0,0},
row{0,1,0},
row{0,0,1}
};
matr mul(matr l,matr r)
{
matr res{};
for (int i = 0; i < 3; ++i)
for (int j = 0; j < 3; j++)
{
for (int k = 0; k < 3; k++)
res[i][j] += l[i][k] * r[k][j];
res[i][j]%=MOD;
}
return res;
}
const matr X={
row{1,0,0},
row{1,1,0},
row{1,0,1}
};
const matr Y={
row{1,1,0},
row{0,1,0},
row{0,1,1}
};
const matr invX={
row{1,0,0},
row{-1,1,0},
row{-1,0,1}
};
const matr invY={
row{1,-1,0},
row{0,1,0},
row{0,-1,1}
};
auto ret(matr res)
{
return (res[2][0]+res[2][1]+1)%MOD;
}
#else
using matr=string;
const matr ONE;
matr mul(const matr& l,const matr& r)
{
return l+r;
}
const matr X="1";
const matr Y="0";
auto ret(matr res)
{
return res;
}
#endif
matr pow(matr x,int y)
{
matr res=ONE;
while(y)
{
if(y&1)
res=mul(res,x);
y>>=1;
x=mul(x,x);
}
return res;
}
matr rec(int a, int b, matr x, matr y)
{
while(a>1||b>1)
{
// cout << a << " " << b << " " << x << " " << y << "\n";
matr xx=mul(pow(x, b / a - 1),y);
matr yy=mul(x,xx);
tie(a, b, y, x)=tuple(a - b % a, a, xx, yy);
}
return y;
}
auto solve(int a,int b)
{
int g=__gcd(a,b);
bool sw=a>b;
if(sw)
swap(a,b);
matr res=rec(a/g,b/g,Y,mul(X,Y));
res=pow(res,g);
if(!sw)
{
res=mul(res,invY);
res=mul(res,invX);
res=mul(res,Y);
res=mul(res,X);
}
return ret(res);
}
std::string gen_string(int64_t a, int64_t b) {
std::string res;
int64_t ia = 0, ib = 0;
while (ia + ib < a + b) {
if ((__int128)ia * b <= (__int128)ib * a) {
res += '0';
ia++;
} else {
res += '1';
ib++;
}
}
reverse(res.begin(),res.end());
return res;
}
signed main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--)
{
int a,b;
cin>>a>>b;
// cout<<gen_string(a,b)<<"\n";
cout<<solve(a,b)<<"\n";
}
}
详细
Test #1:
score: 0
Wrong Answer
time: 1ms
memory: 3408kb
input:
6 1 1 3 5 4 7 8 20 4 10 27 21
output:
4 70 264 196094 608 667131122
result:
wrong answer 4th numbers differ - expected: '196417', found: '196094'