zoukankan      html  css  js  c++  java
  • 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
    ",ans.v[1][1]);
    71     return 0;
    72 }
  • 相关阅读:
    leetcode——448.找到所有数组中消失的数字
    leetcode——268.缺失数字
    leetcode——680.验证回文字符串2
    leetcode——125.验证回文串
    leetcode——217.存在重复元素
    leetcode——189.旋转数组
    02-04 线性回归
    02-03 感知机对偶形式(鸢尾花分类)
    02-02 感知机原始形式(鸢尾花分类)
    02-01 感知机
  • 原文地址:https://www.cnblogs.com/ccd2333/p/6511941.html
Copyright © 2011-2022 走看看