1 条题解
-
0
你也没告诉我类欧有别的类欧啊!
首先这题为什么是反过来的呢?我玩了一下数列后发现这个数列其实只和最后两项有关,剩下的都是固定的。即:
那就直接 dfs() 表示当前为 和 ,还有 项没求。
又玩了一会数列发现这个数列最后会出现 的格式,然后遇到这种情况直接判断就行了。
然后我就发现这很容易被卡掉,然后就不会了去看题解。
结果题解提到了一个我发现了但没关注的小细节。就是当 明显大于 时会出现 这种三个一循环的情况,这时可以直接变成 dfs()。然后管这叫做类欧几里得算法。
#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
- 上传者