QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#250084#7620. Yet Another Subsequence Problemucup-team2307WA 1ms3408kbC++202.5kb2023-11-12 21:13:502023-11-12 21:13:51

Judging History

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

  • [2023-11-12 21:13:51]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:3408kb
  • [2023-11-12 21:13:50]
  • 提交

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'