第五届蓝桥杯题
同样限制比较多的一道题目,事先需要先分析一下
两种操作+a || -b 不妨记为P操作,则设首项为x,可以得到一个等式x+(x+P)+(x+2P)+…+(x+(n−1)P)=sx+(x+P)+(x+2P)+…+(x+(n−1)P)=s,将这个式子整理一下,就是nx+P+2P+…+(n−1)P=snx+P+2P+…+(n−1)P=s,即(s−(P+2P+…+(n−1)P))/n=x(s−(P+2P+…+(n−1)P))/n=x。
显然可得首项x得确定之和n有关,n确定x就可以确定
f[i][j]这次表示前i项之和对n求模为j的集合。
f[i][j]=f[i−1][j−a∗i]+f[i−1][j+b∗i]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter pw = new PrintWriter(System.out);
static int N = 1010, n, s, a, b, MOD = (int) (1e8 + 7);
static int f[][] = new int[N][N];
public static void main(String[] args) throws IOException {
String ss[] = br.readLine().split(" ");
n = Integer.parseInt(ss[0]);
s = Integer.parseInt(ss[1]);
a = Integer.parseInt(ss[2]);
b = Integer.parseInt(ss[3]);
f[0][0] = 1;
for (int i = 1; i < n; i++) {
for (int j = 0; j < n; j++) {
f[i][j] = (f[i - 1][mod(j - a * i, n)] + f[i - 1][mod(j + b * i, n)]) % MOD;
}
}
pw.print(f[n - 1][mod(s, n)]);
pw.flush();
pw.close();
br.close();
}
public static int mod(int a, int b) {
return (a % b + b) % b;
}
}