题1简化版

B  A×B (简化版)

Time Limit:233MS  Memory Limit:65535K

题型: 编程题   语言: 无限制

 

描述

给出两个数列a、b,构造一个矩阵mat,使得mat[i][j] = a[i] * b[j]。
求mat中不同的值有多少个。

 

输入格式

输入T,表示以下有T组测试数据:

对于每一组测试数据,输入一行9个整数 n, m, a0, b0, p, q, x, y, mx。
其中,a[0] = a0,a[i] = a[i - 1] * p + x (1 <= i < n);
      b[0] = b0, b[j] = b[j - 1] * q + y (1 <= j < m)。
由于生成出来的数字比较大,所以对于a和b每一个元素对其模mx。

数据范围:
T <= 5
1 <= n, m <= 2000
1 <= a0, b0, p, q, x, y, mx <= 1000

 

输出格式

每组数据一行,输出对应的结果。

 

输入样例

1
2 2 1 2 3 4 5 7 10

 

输出样例

4

 

Hint

解释sample:
a[] = { 1, 8 };
b[] = { 2, 5 };
mat[][] = {
    { 2, 16 },
    { 5, 40 }
};
#include<stdio.h>
#include<string.h>
int a[2000],b[2000],cc[4000000];
int main()
{
    int T,t;
    scanf("%d",&T);
    int num[T];
    for(t=0;t<T;t++)
    {
        num[t]=0;
        int i,j;
        int n,m,a0,b0,p,q,x,y,mx;
        scanf("%d%d%d%d%d%d%d%d%d",&n,&m,&a0,&b0,&p,&q,&x,&y,&mx);
        a[0]=a0%mx;
        b[0]=b0%mx;
        for(i=1;i<n;i++)
            a[i]=(a[i-1]*p+x)%mx;
        for(i=1;i<m;i++)
            b[i]=(b[i-1]*q+y)%mx;
            int c=0;
        memset(cc,0,sizeof cc);
        for(i=0;i<n;i++)
        for(j=0;j<m;j++)
        {
            c=a[i]*b[j];
            if(!cc[c])\计算不重叠的个数
            {cc[c]++;
            num[t]++;}
        }
    }
    for(t=0;t<T;t++)
        printf("%d
",num[t]);
    return 0;
}
原文地址:https://www.cnblogs.com/scau-zk/p/4916267.html