bzoj 2004: [Hnoi2010]Bus 公交线路

又是神题,,,我太弱。。。

%%%(说这是大水题的神犇。。)

 1 #include <bits/stdc++.h>
 2 #define LL long long
 3 #define inf 0x3f3f3f3f
 4 using namespace std;
 5 inline int ra()
 6 {
 7     int x=0,f=1; char ch=getchar();
 8     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
 9     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
10     return x*f;
11 }
12 const LL mod=30031;
13 int bin[20];
14 int n,K,P,cnt;
15 int v[205];
16 struct  Maxtri 
17 {
18     LL v[205][205];
19     Maxtri(){memset(v,0,sizeof(v));}
20     friend Maxtri operator * (Maxtri a, Maxtri b)
21     {
22         Maxtri c;
23         for (int i=1; i<=cnt; i++)
24             for (int j=1; j<=cnt; j++)
25             {
26                 for (int k=1; k<=cnt; k++)
27                     c.v[i][j]+=a.v[i][k]*b.v[k][j];
28                 c.v[i][j]%=mod;
29             }
30         return c;
31     }
32     friend Maxtri operator ^ (Maxtri a, int b)
33     {
34         Maxtri ans;
35         for (int i=1; i<=cnt; i++) ans.v[i][i]=1;
36         for (int i=b; i; i>>=1,a=a*a)
37             if (i&1) ans=ans*a;
38         return ans;
39     }
40 }a,b,ans;
41 void dfs(int now, int num, int sta)
42 {
43     if (num==K) 
44     {
45         v[++cnt]=sta;
46         return;
47     }
48     for (int i=now-1; i; i--)
49         dfs(i,num+1,sta+bin[i-1]);
50 }
51 int lowbit(int x){return x&(-x);}   //lowbit有毒????!!!(是不是define的lowbit在处理==和&就sb了,,woc。。。) 
52 void pre()
53 {
54     for (int i=1; i<=cnt; i++)
55         for (int j=1; j<=cnt; j++)
56         {
57             int x=(v[i]<<1)^bin[P]^v[j];
58             if (x==lowbit(x)) b.v[i][j]=1;
59         }
60 }
61 int main(int argc, char const *argv[])
62 {
63     bin[0]=1; for (int i=1; i<20; i++) bin[i]=bin[i-1]<<1;
64     n=ra(); K=ra(); P=ra();
65     dfs(P,1,bin[P-1]);
66     pre();
67     ans.v[1][1]=1;
68     Maxtri t=b^(n-K);
69     ans=ans*t;
70     printf("%d\n",ans.v[1][1]);
71     return 0;
72 }

 

posted @ 2017-03-06 21:01  ws_ccd  阅读(142)  评论(0编辑  收藏  举报