标签:
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
解释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\n",num[t]); return 0; }
标签:
原文地址:http://www.cnblogs.com/scau-zk/p/4916267.html