在前一天的多校训练中只有一点点的思路,但是忘了用__int64,只是用int结果一直是wrong,就弃疗了,今天看了其他大神的题解豁然开朗。
因为题目的要求是从x[ ]数组中选出m个元素(m要最大),组成y[ ],y[ ]中的任何一个必须小于等于L还有任意两个相加的和必须小于等于L,所以只要将小于等于L/2的数全部取出放入y中,然后再判断最大的被选中的元素值和最小的未被选中的元素值是否比L小,若是m++;输出m的值
代码:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <queue>
#include <cstdio>
#include <cmath>
#include <stack>
using namespace std;
int main() {
__int64 n,L,A,B,mod;
while(~scanf("%I64d%I64d%I64d%I64d%I64d",&n,&L,&A,&B,&mod)) {
__int64 mid=L/2;
__int64 k=1;
__int64 MAX=-1;
int m=0;
__int64 MIN=2000000001;
for(__int64 i=1; i<=n; i++) {
__int64 temp=(A*i+B)%mod;
if(temp<=mid) {
m++;
if(temp>MAX) {
MAX=temp;
}
} else {
if(temp<MIN) {
MIN=temp;
}
}
}
if(MAX+MIN<=L) {
m++;
}
printf("%d\n",m);
}
return 0;
}