HAOI2008题解

又来写题解辣~然而并不太清楚题目排列情况。。。不管辣先写起来~

T1:[bzoj1041]

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1041

一个赤果果的数学题~~~

首先坐标轴上一定有四个,

最大公约数搞一下然后判断一下就可以啦,细节全部都在代码~

代码如下:

 1 var i,j,ans,d:longint;
 2     t,r,m:int64;
 3 function flag(x,y:longint):longint;
 4 var t:longint;
 5 begin
 6   if (x<y) then
 7   begin
 8     t:=x;
 9     x:=y;
10     y:=t;
11   end;
12   x:=x mod y;
13   if (x=0) then exit(y) else exit(flag(x,y));
14 end;
15 begin
16   readln(r);
17   ans:=0;
18   t:=2*r;
19   for d:=1 to trunc(sqrt(t)) do
20     if (t mod d=0) then
21     begin
22       for i:=1 to trunc(sqrt(r/d)) do
23       begin
24         j:=trunc(sqrt(t/d-i*i));
25         if (j=sqrt(t/d-i*i)) and (i<>j) and (flag(i,j)=1) then inc(ans);
26       end;
27       for i:=1 to trunc(sqrt(d/2)) do
28       begin
29         j:=trunc(sqrt(d-i*i));
30         if (j*j=d-i*i) and (i<>j) and (flag(i,j)=1) then inc(ans);
31       end;
32     end;
33   ans:=ans*4+4;
34   writeln(ans);
35 end.

T2:[bzoj1042]

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1042

又一个数学题hhh

先动态规划预处理,然后容斥原理就可以了。

代码如下:

 1 var i,j,k,l,tot,g:longint;
 2     c,s:array[1..4] of longint;
 3     f:array[0..100010] of int64;
 4     ans:int64;
 5 function f1(x:longint):int64;
 6 begin
 7   if (x>=0) then exit(f[x]) else exit(0);
 8 end;
 9 begin
10   fillchar(c,sizeof(c),0);
11   fillchar(f,sizeof(f),0);
12   readln(c[1],c[2],c[3],c[4],tot);
13   f[0]:=1;
14   for i:=1 to 4 do
15     for j:=c[i] to 100000 do
16       f[j]:=f[j]+f[j-c[i]];
17   for i:=1 to tot do
18   begin
19     fillchar(s,sizeof(s),0);
20     for j:=1 to 4 do
21       read(s[j]);
22     readln(g);
23     ans:=f[g];
24     for j:=1 to 4 do
25       ans:=ans-f1(g-(s[j]+1)*c[j]);
26     for j:=1 to 3 do
27       for k:=j+1 to 4 do
28         if (j<>k) then
29           ans:=ans+f1(g-(s[j]+1)*c[j]-(s[k]+1)*c[k]);
30     for j:=1 to 2 do
31       for k:=j+1 to 3 do
32         for l:=k+1 to 4 do
33           if (j<>k) and (k<>l) and (j<>l) then
34             ans:=ans-f1(g-(s[j]+1)*c[j]-(s[k]+1)*c[k]-(s[l]+1)*c[l]);
35     ans:=ans+f1(g-(s[1]+1)*c[1]-(s[2]+1)*c[2]-(s[3]+1)*c[3]-(s[4]+1)*c[4]);
36     writeln(ans);
37   end;
38 end.

 

(T3先留好坑。。。之后补)

T4:[bzoj1044]

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1044

第一问就是NOIP2015的day2T1(把我坑死的QAQQQ),

第二问就是动态规划就行了。

代码如下:

 1 var n,m,i,j,k,ans,left,right,max,anss,s,now1,x,y:longint;
 2     l,sl,ty:array[0..50000] of longint;
 3     f,f1:array[0..1,-1..50000] of longint;
 4 function tryit(x:longint):boolean;
 5 var i,j,s,left,right:longint;
 6 begin
 7   i:=0;
 8   j:=0;
 9   now1:=0;
10   while (i<n) do
11   begin
12     left:=i+1;
13     right:=n;
14     i:=(left+right) div 2;
15     while (right-left>1) do
16     begin
17       if (sl[i]-sl[now1]<=x) then left:=i else right:=i;
18       i:=(left+right) div 2;
19     end;
20     if (sl[right]-sl[now1]<=x) then i:=right else i:=left;
21     if (sl[n]-sl[now1]>x) then inc(j);
22     now1:=i;
23   end;
24   if (j>m) then exit(false) else exit(true);
25 end;
26 begin
27   read(n,m);
28   fillchar(l,sizeof(l),0);
29   fillchar(sl,sizeof(sl),0);
30   s:=0;
31   max:=0;
32   for i:=1 to n do
33   begin
34     read(l[i]);
35     sl[i]:=sl[i-1]+l[i];
36     if (l[i]>max) then max:=l[i];
37     s:=s+l[i];
38   end;
39   left:=max;
40   right:=s;
41   ans:=(left+right) div 2;
42   while (right-left>1) do
43   begin
44     if not(tryit(ans)) then left:=ans else right:=ans;
45     ans:=(left+right) div 2;
46   end;
47   ans:=right;
48   if tryit(left) then ans:=left;
49   write(ans,' ');
50   fillchar(f,sizeof(f),0);
51   fillchar(ty,sizeof(ty),0);
52   fillchar(f1,sizeof(f1),0);
53   anss:=0;
54   f[1,0]:=1;
55   for i:=0 to n do
56     f1[1,i]:=1;
57   k:=0;
58   for j:=1 to n do
59   begin
60     while (sl[j]-sl[k]>ans) do inc(k);
61     ty[j]:=k;
62   end;
63   for i:=1 to m+1 do
64   begin
65     x:=i mod 2;
66     y:=1-x;
67     for j:=0 to n do
68     begin
69       f[y,j]:=(f1[x,j-1]-f1[x,ty[j]-1]+10007) mod 10007;
70       f1[y,j]:=(f[y,j]+f1[y,j-1]) mod 10007;
71     end;
72     anss:=(anss+f[y,n]) mod 10007;
73   end;
74   writeln(anss);
75 end.

T5:[bzoj1045]

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1045

这题。。。标准的组合数学嘛~~~

随便搞一下就粗来了。。。QAQ

辣么辣么多数学题QAQQQ

代码如下:

 1 var n,i,j:longint;
 2     sum,ave,ans:int64;
 3     a,p:array[0..1000000] of longint;
 4 procedure qsort(lx,rx:longint);
 5 var i,j,m,x:longint;
 6 begin
 7   i:=lx;
 8   j:=rx;
 9   m:=p[(i+j) div 2];
10   repeat
11     while (p[i]<m) do inc(i);
12     while (p[j]>m) do dec(j);
13     if (i<=j) then
14     begin
15       x:=p[i];
16       p[i]:=p[j];
17       p[j]:=x;
18       inc(i);
19       dec(j);
20     end;
21   until (i>j);
22   if (i<rx) then qsort(i,rx);
23   if (j>lx) then qsort(lx,j);
24 end;
25 begin
26   readln(n);
27   fillchar(a,sizeof(a),0);
28   fillchar(p,sizeof(p),0);
29   sum:=0;
30   for i:=1 to n do
31   begin
32     readln(a[i]);
33     sum:=sum+a[i];
34   end;
35   ave:=sum div n;
36   for i:=2 to n do
37     p[i]:=p[i-1]-ave+a[i];
38   qsort(1,n);
39   ans:=0;
40   for i:=1 to n do
41     ans:=ans+abs(p[i]-p[n div 2+1]);
42   writeln(ans);
43 end.

T6:[bzoj1054]

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1054

QAQ这题是一个赤果果的BFS。。。

不对。。。

BFS要判重。。。这题判重都不要hhh

代码如下:

 1 type arr=array[1..4,1..4] of longint;
 2 const modp=10000009;
 3     tx:array[1..4] of longint=(1,-1,0,0);
 4     ty:array[1..4] of longint=(0,0,1,-1);
 5 var i,j,k,s,t,s1,s2,rx,ry,swap,rh:longint;
 6     q:array[0..65536*2] of arr;
 7     mark:array[0..65536*2] of boolean;
 8     step:array[0..65536*2] of longint;
 9     ans:arr;
10     ch:char;
11 function hash(x:arr):longint;
12 var i,j,ans,now:longint;
13 begin
14   ans:=0;
15   now:=1;
16   for i:=1 to 4 do
17     for j:=1 to 4 do
18     begin
19       ans:=(ans+int64(now*x[i,j]));
20       now:=(now+now);
21     end;
22   exit(ans);
23 end;
24 begin
25   s:=0;
26   t:=1;
27   fillchar(q,sizeof(q),0);
28   fillchar(ans,sizeof(ans),0);
29   for i:=1 to 4 do
30   begin
31     for j:=1 to 4 do
32     begin
33       read(ch);
34       while (ch<>'0') and (ch<>'1') do read(ch);
35       q[0,i,j]:=ord(ch)-48;
36     end;
37   end;
38   for i:=1 to 4 do
39   begin
40     for j:=1 to 4 do
41     begin
42         read(ch);
43         while (ch<>'0') and (ch<>'1') do read(ch);
44         ans[i,j]:=ord(ch)-48;
45     end;
46   end;
47   s1:=hash(q[s]);s2:=hash(ans);
48   mark[s1]:=true;
49   fillchar(step,sizeof(step),0);
50   if (s1=s2) then writeln('0') else
51   begin
52     while (s<t) do
53     begin
54       for i:=1 to 4 do
55         for j:=1 to 4 do
56           if (q[s,i,j]>0) then
57           begin
58             for k:=1 to 4 do
59             begin
60               rx:=i+tx[k];ry:=j+ty[k];
61               if  (1<=rx) and (rx<=4) and (1<=ry) and (ry<=4) and (q[s,rx,ry]=0) then
62               begin
63                 swap:=q[s,i,j];q[s,i,j]:=q[s,rx,ry];q[s,rx,ry]:=swap;
64                 rh:=hash(q[s]);             
65               if not(mark[rh]) then
66                 begin
67                   if (rh=s2) then
68                   begin
69                     writeln(step[s]+1);
70                     halt;
71                   end;
72                   mark[rh]:=true;
73                   q[t]:=q[s];
74                   step[t]:=step[s]+1;
75                   inc(t);
76                 end;
77                 swap:=q[s,i,j];q[s,i,j]:=q[s,rx,ry];q[s,rx,ry]:=swap;
78               end;
79               end;
80             end;
81         inc(s);
82         end;
83     end;
84 end.

T7:[bzoj1055]

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1055

又一个动态规划呢!

不过是一个记忆化搜索。。。

代码如下:

 1 const ch:array[1..4] of char=('W','I','N','G');
 2 var i,j:longint;
 3     f,flag:array[1..4,1..200,1..200] of boolean;
 4     x:array[1..4,1..16,1..2] of char;
 5     a:array[1..4] of longint;
 6     s:string;
 7     flagg:boolean;
 8 function calc(x:char):longint;
 9 begin
10   if (x='W') then exit(1)
11   else if (x='I') then exit(2)
12   else if (x='N') then exit(3)
13   else if (x='G') then exit(4);
14 end;
15 function f1(k,left,right:longint):boolean;
16 var i,j,t1,t2:longint;
17 begin
18   if flag[k,left,right] then exit(f[k,left,right]);
19   flag[k,left,right]:=true;
20   if (right=left) and (s[left]=ch[k]) then
21   begin
22     f[k,left,right]:=true;
23     exit(true);
24   end;
25   for i:=1 to a[k] do
26   begin
27     t1:=calc(x[k,i,1]);
28     t2:=calc(x[k,i,2]);
29     for j:=left to right-1 do
30       if f1(t1,left,j) and f1(t2,j+1,right) then
31       begin
32         f[k,left,right]:=true;
33         exit(true);
34       end;
35   end;
36   f[k,left,right]:=false;
37   exit(false);
38 end;
39 begin
40   fillchar(a,sizeof(a),0);
41   for i:=1 to 4 do
42     read(a[i]);
43   readln;
44   fillchar(f,sizeof(f),false);
45   fillchar(flag,sizeof(flag),false);
46   for j:=1 to 4 do
47     for i:=1 to a[j] do
48       readln(x[j,i,1],x[j,i,2]);
49   readln(s);
50   flagg:=false;
51   for i:=1 to 4 do
52     if f1(i,1,length(s)) then
53     begin
54       write(ch[i]);
55       flagg:=true;
56     end;
57   if not(flagg) then write('The name is wrong!');
58   writeln;
59 end.

(T8的坑也先留着。。。QAQQQ)

终于写完啦~~~撒花撒花~~~

 

posted @ 2016-11-11 21:35  Tommyr7  阅读(298)  评论(0编辑  收藏  举报