题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4379
多么简单的一道题,比赛的时候竟然想着用数组存上,结果MLE了,然后就一直在纠结他的那句every pair of (Yi, Yj) satisfies Yi + Yj <= L (1 ≤ i < j ≤ m), and every Yi <= L (1 ≤ i ≤ m ) 。。。。
思路:从1-n算出Xi ,如果<=L/2,sum++,算的过程中记下<=L/2的最大值和>L/2的最小值,如果这两个值的和<=L,sum++。。
代码:
1 #include <iostream>
2 #include <cstring>
3 #include <cstdio>
4 #define LL long long
5 using namespace std;
6 int main()
7 {
8 LL a,b,mod,n,l,min,max,ll,k;
9 int i,j,sum;
10 while(~scanf("%I64d%I64d%I64d%I64d%I64d",&n,&l,&a,&b,&mod))
11 {
12 max=0;
13 min=l;
14 sum=0;
15 ll=l/2;
16 for(i=1;i<=n;i++)
17 {
18 k=(a*i+b)%mod;
19 if(k<=ll)
20 {
21 sum++;
22 if(k>max)
23 max=k;
24 }
25 else if(k<min)
26 min=k;
27 }
28 if(min+max<=l)
29 sum++;
30 printf("%d\n",sum);
31 }
32 return 0;
33 }
2 #include <cstring>
3 #include <cstdio>
4 #define LL long long
5 using namespace std;
6 int main()
7 {
8 LL a,b,mod,n,l,min,max,ll,k;
9 int i,j,sum;
10 while(~scanf("%I64d%I64d%I64d%I64d%I64d",&n,&l,&a,&b,&mod))
11 {
12 max=0;
13 min=l;
14 sum=0;
15 ll=l/2;
16 for(i=1;i<=n;i++)
17 {
18 k=(a*i+b)%mod;
19 if(k<=ll)
20 {
21 sum++;
22 if(k>max)
23 max=k;
24 }
25 else if(k<min)
26 min=k;
27 }
28 if(min+max<=l)
29 sum++;
30 printf("%d\n",sum);
31 }
32 return 0;
33 }