Combinatorics Problem
题意:点上面的链接吧,都是公式,不好表达
o(〃‘▽’〃)o
思路:
首先可以发现,因为C(x, y),如果x 小于 y就没意义,所以b[k]以前的数都没意义,最后只要求b[k~n]的异或和就行了。
令f[i][j]表示当k等于i是,b中符合条件的第j个数字
f[i][j]=C(i+j-1,i)*a[1]+…+C(i,i)*a[j];
f[i][j-1]=C(i+j-2,i)*a[1]+…+C(i,i)*a[j-1];
f[i-1][j]=C(i+j-2,i-1)*a[1]+…+C(i-1,i-1)*a[j];
由组合数的递推式C(n,m)=C(n-1,m-1)+C(n-1,m)可以推出公式:f[i][j]=f[i-1][j]+f[i][j-1]
代码:
#include <iostream>
#include <algorithm>
#include <vector>
#define int long long
#define endl '\n'
using namespace std;
const int mod = 998244353;
const int maxn = 1e7 + 7;
int n, x, y, m, k;
signed main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n;
vector<int> a(n + 1);
cin >> a[1];
cin >> x >> y >> m >> k;
for(int i = 2; i <= n; i ++ )
a[i] = (a[i - 1] * x + y) % m;
vector<vector<int>> f(k + 1, vector<int>(n + 1, 0));
for(int i = 1; i <= n; i ++ )
f[0][i] = f[0][i - 1] + a[i];
for(int i = 1; i <= k; i ++ ){
f[i][1] = a[1];
for(int j = 2; j <= n; j ++ ){
f[i][j] = (f[i][j - 1] + f[i - 1][j]) % mod;
}
}
int ans = 0;
for(int i = 1; i <= (n - k + 1); i ++ )
ans ^= ((k + i - 1) * f[k][i]);
cout << ans << endl;
}