题目描述
给定一个数字序列{X1, X2, ... , Xn}, 假定 Xk = (A * k + B) % mod。你的任务就是找一个最大的子序列{Y1, Y2, ... , Ym} ,对于每对 (Yi, Yj)要求满足Yi + Yj <= L (1 ≤ i < j ≤ m), 而且同时满足Yi <= L (1 ≤ i ≤ m )。
现在给定n,L,A,B和mod,你的任务就是找出上述最大的m值。输入
输入包括多组测试数据,直到文件尾。每个测试数据占一行,包括5个整数: n, L, A, B 和mod. (1 ≤ n ≤ 2 * 107, 1 ≤ L ≤ 2 * 109, 1 ≤ A, B, mod ≤ 109)
输出
对于每组测试数据,输出m值,占一行。
样例输入 复制
1 8 2 3 6 5 8 2 3 6
样例输出 复制
1 4
正确代码
这道题的思路的话
个人的理解 首先要注意的是longlong的使用
然后是循环注意一定是从1开始的
x的序列我们都可以求出来 那是否符合y的要求
从哪几方面来判断呢?
首先我们要确定两个边界 最大最小(其实可以是左边界和右边界)。
要考虑到 l/2的情况/
#include <stdio.h>
#include <string.h>
int main()
{
long long n,l,a,b,mod;
while(scanf("%lld %lld %lld %lld %lld",&n,&l,&a,&b,&mod)!=EOF){
long long i,x,max=l,min=0,m=0;
for(i=1;i<=n;i++){
x=(a*i+b)%mod;
if(x<=l/2){
m++;
if(x>min) min=x;
}
else if(x<max) max=x;
}
if(min+max<=l) m++;
printf("%lld\n",m);
}
return 0;
}
我的错误的代码
错的地方是x<=l/2;
#include<stdio.h>
int main()
{
long long n,l,a,b,mod;
while(scanf("%lld %lld %lld %lld %lld",&n,&l,&a,&b,&mod)!=EOF)
{
int m=0;
int x;
int max=l,min=0;
for(int i=1;i<=n;i++)
{
x=(a*i+b)%mod;
if(x<l/2)
{
m++;
if(x>min)
min=x;
}
else if(x<max)
max=x;
}
if(max+min<=l)
m++;
printf("%lld\n",m);
}
}