HDU 5400 Arithmetic Sequence

来源:互联网 发布:mysql免安装版安装教程 编辑:程序博客网 时间:2024/05/15 06:15
Problem Description
A sequence b1,b2,,bn are called (d1,d2)-arithmetic sequence if and only if there exist i(1in) such that for every j(1j<i),bj+1=bj+d1 and for every j(ij<n),bj+1=bj+d2.

Teacher Mai has a sequence a1,a2,,an. He wants to know how many intervals [l,r](1lrn) there are that al,al+1,,ar are (d1,d2)-arithmetic sequence.
 

Input
There are multiple test cases.

For each test case, the first line contains three numbers n,d1,d2(1n105,|d1|,|d2|1000), the next line contains n integers a1,a2,,an(|ai|109).
 

Output
For each test case, print the answer.
 

Sample Input
5 2 -20 2 0 -2 05 2 32 3 3 3 3
 

Sample Output
125
这题注意一下d1==d2的情况
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<set>#include<map>#include<queue>#include<stack>#include<cmath>#include<cstdio>#include<vector>#include<string>#include<cstring>#include<algorithm>#include<functional>using namespace std;typedef long long LL;const LL base = 1e9 + 7;const int maxn = 105;LL T, n, m, f[maxn], a[maxn][maxn];inline void read(int &x){    char ch;    while ((ch = getchar())<'0' || ch>'9');    x = ch - '0';    while ((ch = getchar()) >= '0' && ch <= '9') x = x * 10 + ch - '0';}int main(){    //read(T);    for (int i = f[0] = 1; i <= 100; i++) f[i] = f[i - 1] * i % base;    while (scanf("%I64d%I64d", &n, &m) != EOF)    {        LL tot = 0, ans = 1;        for (int i = 1; i <= m; i++)        {            scanf("%I64d", &a[i][1]);            if (a[i][1] == -1) tot++;            else for (int j = 2; j <= n; j++)            {                scanf("%I64d", &a[i][j]);                for (int k = j - 1; k; k--) if (a[i][j] == a[i][k]) ans = 0;            }        }        for (int i = 1; i < tot; i++) ans = ans * f[n] % base;        if (tot == 0)        {            for (int i = 1; i <= n; i++) a[0][i] = i;            for (int i = m; i; i--)                for (int j = 1; j <= n; j++) a[0][j] = a[i][a[0][j]];            for (int i = 1; i <= n; i++) if (a[0][i] != i) ans = 0;        }        printf("%I64d\n", ans);    }    return 0;}


0 0
原创粉丝点击