hdu 4379 The More The Better ( 2012 Multi-University Training Contest 8)
The More The Better
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 800 Accepted Submission(s): 208
Problem Description
Given an sequence of numbers {X1, X2, ... , Xn}, where Xk = (A * k + B) % mod. Your task is to find the maximum sub sequence {Y1, Y2, ... , Ym} where every pair of (Yi, Yj) satisfies Yi + Yj <= L (1 ≤ i < j ≤ m), and every Yi <= L (1 ≤ i ≤ m ).
Now given n, L, A, B and mod, your task is to figure out the maximum m described above.
Now given n, L, A, B and mod, your task is to figure out the maximum m described above.
Input
Multiple test cases, process to the end of input. Every test case has a single line. A line of 5 integers: n, L, A, B and mod. (1 ≤ n ≤ 2*107, 1 ≤ L ≤ 2*109, 1 ≤ A, B, mod ≤ 109)
Output
For each case, output m in one line.
Sample Input
1 8 2 3 65 8 2 3 6
Sample Output
1 4
Source
简单题,首先想到所有小于 L/2 的,统统可以放进来,最后,按照题意,还可能可以放一个大于 L/2 的数进来,当小于 L/2 的数里面的最大值加上这个大于 L/2 的数的和小于 L 时,答案加一。最后要注意所有数都小于 L/2 的处理。O(n) 算法可过此题。
好想说这是好蛋疼的一道题,错了不知道多少次 ,发现 错在了 min = 1<<62 和 min = 1 min<<= 62 的值竟然不一样(min 为 long long)tmd。。。。。
View Code
1 #include<stdio.h>
2 #include<iostream>
3 #include<algorithm>
4 #include<cstring>
5 #include<cmath>
6 #include<queue>
7 #include<set>
8 #include<map>
9 #define Min(a,b) a>b?b:a
10 #define Max(a,b) a>b?a:b
11 #define CL(a,num) memset(a,num,sizeof(a));
12 #define inf 1<<62
13 #define maxn 1000010
14 #define eps 1e-6
15 #define ll __int64
16
17
18 using namespace std;
19
20
21 int main()
22 {
23
24 ll a,b;
25
26 ll mod,n;
27 ll l;
28 int k;
29 //freopen("data.txt","r",stdin);
30 while(scanf("%I64d%I64d%I64d%I64d%I64d",&n,&l,&a,&b,&mod)!=EOF)
31 {
32 ll mx = 0;
33 int cnt = 0;
34 ll mi = inf ;
35 int mid = l/2;
36 for( k = 1 ; k <= n;++k)
37 {
38 ll tmp = ( a*k + b)%mod ;
39 if(tmp <= mid)
40 {
41 cnt ++;
42 if(tmp > mx) mx = tmp;
43
44 }
45 else
46 {
47
48 if(mi > tmp) mi = tmp ;
49
50
51 }
52
53 }
54
55
56 if(mi + mx <= l)cnt++;
57 printf("%d\n",cnt);
58 }
59 return 0;
60
61 }
2 #include<iostream>
3 #include<algorithm>
4 #include<cstring>
5 #include<cmath>
6 #include<queue>
7 #include<set>
8 #include<map>
9 #define Min(a,b) a>b?b:a
10 #define Max(a,b) a>b?a:b
11 #define CL(a,num) memset(a,num,sizeof(a));
12 #define inf 1<<62
13 #define maxn 1000010
14 #define eps 1e-6
15 #define ll __int64
16
17
18 using namespace std;
19
20
21 int main()
22 {
23
24 ll a,b;
25
26 ll mod,n;
27 ll l;
28 int k;
29 //freopen("data.txt","r",stdin);
30 while(scanf("%I64d%I64d%I64d%I64d%I64d",&n,&l,&a,&b,&mod)!=EOF)
31 {
32 ll mx = 0;
33 int cnt = 0;
34 ll mi = inf ;
35 int mid = l/2;
36 for( k = 1 ; k <= n;++k)
37 {
38 ll tmp = ( a*k + b)%mod ;
39 if(tmp <= mid)
40 {
41 cnt ++;
42 if(tmp > mx) mx = tmp;
43
44 }
45 else
46 {
47
48 if(mi > tmp) mi = tmp ;
49
50
51 }
52
53 }
54
55
56 if(mi + mx <= l)cnt++;
57 printf("%d\n",cnt);
58 }
59 return 0;
60
61 }