1 条题解

  • 0
    @ 2026-7-5 11:57:44

    你也没告诉我类欧有别的类欧啊!

    首先这题为什么是反过来的呢?我玩了一下数列后发现这个数列其实只和最后两项有关,剩下的都是固定的。即:

    i[0,n2],Ai=Ai+1Ai+2\forall i \in [0,n-2], A_i = |A_{i+1}-A_{i+2}|

    那就直接 dfs(a,b,ta,b,t) 表示当前为 aabb,还有 tt 项没求。

    又玩了一会数列发现这个数列最后会出现 x,x,0,x,x,0x,x,0,x,x,0… 的格式,然后遇到这种情况直接判断就行了。

    然后我就发现这很容易被卡掉,然后就不会了去看题解。

    结果题解提到了一个我发现了但没关注的小细节。就是当 aa 明显大于 bb 时会出现 a,b,ab,a2b,b,a3b,a4ba,b,a-b,a-2b,b,a-3b,a-4b 这种三个一循环的情况,这时可以直接变成 dfs(a2bk,b,t3ka-2bk,b,t-3k)。然后管这叫做类欧几里得算法。

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    const int N=2e5+10,P=998244353;
    int dfs(int a,int b,int t)
    {
    	if(t==1)return a*b%P;
    	if(b==0)return (t%3==0?a*a%P:0);
    	if(a>2*b&&t>3)
    	{
    		int k=min(a/(2*b),(t-1)/3);
    		return dfs(a-2*k*b,b,t-3*k);
    	}
    	return dfs(b,abs(a-b),t-1);
    }
    signed main()
    {
    	int n,m,x,ans=0;cin>>n>>m>>x;
    	for(int i=0;i<=m;i++)ans=(ans+dfs(x,i,n-1))%P;
    	cout<<ans;
    	return 0;
    }
    • 1

    信息

    ID
    6673
    时间
    2000ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    8
    已通过
    3
    上传者