题解 P5084 【轮换式】
发现
所以分类讨论即可。
我们令
当
当
或者说,
这里给大家提供一个很新颖的方法:韦达定理。
当
当
同样使用韦达定理,得:当
所以:
当
将其乘以
代入,移项,得
再使用一次韦达定理,得:当
所以:
不要忘了取模!!!
还有,十年 long long 见祖宗!!!
另外,负数要转正!!!
不多说了,上代码:
#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e7 + 29;
int n, m, x, y, z, u;
long long arr[100010];
int main() {
cin >> n >> m;
arr[0] = n;
switch (n) {
case 1: {
cin >> x;
for (int i = 1; i <= m; i++) {
arr[i] = arr[i-1] * x;
arr[i] = (arr[i] % mod + mod) % mod;
}
break;
}
case 2: {
cin >> x >> y;
arr[1] = x;
for (int i = 2; i <= m; i++) {
arr[i] = arr[i-1] * x - arr[i-2] * y;
arr[i] = (arr[i] % mod + mod) % mod;
}
break;
}
case 3: {
cin >> x >> y >> z;
arr[1] = x;
arr[2] = x*x - 2*y;
arr[2] = (arr[2] % mod + mod) % mod;
for (int i = 3; i <= m; i++) {
arr[i] = arr[i-1] * x - arr[i-2] * y + arr[i-3] * z;
arr[i] = (arr[i] % mod + mod) % mod;
}
break;
}
case 4: {
cin >> x >> y >> z >> u;
arr[1] = x;
arr[2] = x*x - 2*y;
arr[2] = (arr[2] % mod + mod) % mod;
arr[3] = (long long)x*x*x - 3*x*y + 3*z;
arr[3] = (arr[3] % mod + mod) % mod;
for (int i = 4; i <= m; i++) {
arr[i] = arr[i-1] * x - arr[i-2] * y + arr[i-3] * z - arr[i-4] * u;
arr[i] = (arr[i] % mod + mod) % mod;
}
break;
}
}
cout << arr[m] << endl;
return 0;
}
看在我打