小a的旅行计划(BM模板)

题目链接:https://ac.nowcoder.com/acm/contest/223/B

题目大意:

小a终于放假了,它想在假期中去一些地方游玩,现在有N个景点,编号为1,2,…N1,2,…N,同时小b也想出去游玩。由于一些特殊♂原因,他们的旅行计划必须满足一些条件

首先,他们可以从这N个景点中任意选几个游玩

设小a选出的景点集合为A,小b选的景点集合为B,则需要满足

1. A,B的交集不能为空集

2. A,B不能相互包含(A=B也属于相互包含)

注意:在这里我们认为(A,B)是无序的,即(A,B)和(B,A)是同一种方案。

具体思路:暴力打表,然后把前15项放进BM里,然后就A了?

打表代码:

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 # define ll long long
  4 const int maxn = 2e5  + 100;
  5 const int N  = 100;
  6 ll n;
  7 map<vector<ll>,bool>vis;
  8 map<pair<vector<ll>,vector<ll>>,bool >vis2;
  9 map<int,int>bao;
 10 bool judge(vector<ll>q1,vector<ll>q2)
 11 {
 12     int flag=1;
 13     if(q1==q2)
 14         return false;
 15     bao.clear();
 16     for(int i=0; i<q1.size(); i++)
 17     {
 18         bao[q1[i]]=1;
 19     }
 20     for(int i=0; i<q1.size(); i++)
 21     {
 22         for(int j=0; j<q2.size(); j++)
 23         {
 24             if(q1[i]==q2[j])
 25             {
 26                 flag=0;
 27                 break;
 28             }
 29         }
 30         if(!flag)
 31             break;
 32     }
 33     if(flag)
 34         return false;
 35     int num=0;
 36     for(int i=0; i<q2.size(); i++)
 37     {
 38         if(bao[q2[i]])
 39             num++;
 40     }
 41     if(num==q2.size())
 42         return false;
 43     bao.clear();
 44     for(int i=0; i<q2.size(); i++)
 45     {
 46         bao[q2[i]]=1;
 47     }
 48     num=0;
 49     for(int i=0; i<q1.size(); i++)
 50     {
 51         if(bao[q1[i]])
 52             num++;
 53     }
 54     if(num==q1.size())
 55         return false;
 56     return true;
 57 }
 58 vector<ll>q1;
 59 vector<ll>q2;
 60 bool check(ll tmp1,ll tmp2)
 61 {
 62     q1.clear();
 63     q2.clear();
 64     for(ll i=0; i<n; i++)
 65     {
 66         if((1ll<<i)&tmp1)
 67             q1.push_back(i);
 68     }
 69     for(ll i=0; i<n; i++)
 70     {
 71         if((1ll<<i)&tmp2)
 72             q2.push_back(i);
 73     }
 74     sort(q1.begin(),q1.end());
 75     sort(q2.begin(),q2.end());
 76     if(judge(q1,q2))
 77         return true;
 78     return false;
 79 }
 80 ll cal(ll n)
 81 {
 82     ll maxstate=(1ll<<n)-1;
 83     ll sum=0;
 84     for(ll i=0; i<=maxstate; i++)
 85     {
 86         for(ll j=0; j<=maxstate; j++)
 87         {
 88             if(check(i,j)&&vis2[make_pair(q1,q2)]==0)
 89             {
 90                 vis2[make_pair(q1,q2)]=1;
 91                 vis2[make_pair(q2,q1)]=1;
 92                 sum++;
 93             }
 94         }
 95     }
 96     return sum;
 97 }
 98 int main()
 99 {
100     //   freopen("hqx.out","w",stdout);
101     //scanf("%d",&n);
102     for(ll i=1; i<=10; i++)
103     {
104         n=i;
105         vis.clear();
106         vis2.clear();
107         printf("%lld ",cal(n));
108     }
109
110     return 0;
111 }

很黄,很暴力

BM模板:

  1 #include <bits/stdc++.h>
  2
  3 using namespace std;
  4 #define rep(i,a,n) for (long long i=a;i<n;i++)
  5 #define per(i,a,n) for (long long i=n-1;i>=a;i--)
  6 #define pb push_back
  7 #define mp make_pair
  8 #define all(x) (x).begin(),(x).end()
  9 #define fi first
 10 #define se second
 11 #define SZ(x) ((long long)(x).size())
 12 typedef vector<long long> VI;
 13 typedef long long ll;
 14 typedef pair<long long,long long> PII;
 15 const ll mod=1e8+7;
 16 ll powmod(ll a,ll b)
 17 {
 18     ll res=1;
 19     a%=mod;
 20     assert(b>=0);
 21     for(; b; b>>=1)
 22     {
 23         if(b&1)
 24             res=res*a%mod;
 25         a=a*a%mod;
 26     }
 27     return res;
 28 }
 29 // head
 30
 31 long long _,n;
 32 namespace linear_seq
 33 {
 34 const long long N=10010;
 35 ll res[N],base[N],_c[N],_md[N];
 36
 37 vector<long long> Md;
 38 void mul(ll *a,ll *b,long long k)
 39 {
 40     rep(i,0,k+k) _c[i]=0;
 41     rep(i,0,k) if (a[i])
 42         rep(j,0,k)
 43         _c[i+j]=(_c[i+j]+a[i]*b[j])%mod;
 44     for (long long i=k+k-1; i>=k; i--)
 45         if (_c[i])
 46             rep(j,0,SZ(Md)) _c[i-k+Md[j]]=(_c[i-k+Md[j]]-_c[i]*_md[Md[j]])%mod;
 47     rep(i,0,k) a[i]=_c[i];
 48 }
 49 long long solve(ll n,VI a,VI b)
 50 {
 51     // a 系数 b 初值 b[n+1]=a[0]*b[n]+...
 52 //        printf("%d\n",SZ(b));
 53     ll ans=0,pnt=0;
 54     long long k=SZ(a);
 55     assert(SZ(a)==SZ(b));
 56     rep(i,0,k) _md[k-1-i]=-a[i];
 57     _md[k]=1;
 58     Md.clear();
 59     rep(i,0,k) if (_md[i]!=0)
 60         Md.push_back(i);
 61     rep(i,0,k) res[i]=base[i]=0;
 62     res[0]=1;
 63     while ((1ll<<pnt)<=n)
 64         pnt++;
 65     for (long long p=pnt; p>=0; p--)
 66     {
 67         mul(res,res,k);
 68         if ((n>>p)&1)
 69         {
 70             for (long long i=k-1; i>=0; i--)
 71                 res[i+1]=res[i];
 72             res[0]=0;
 73             rep(j,0,SZ(Md)) res[Md[j]]=(res[Md[j]]-res[k]*_md[Md[j]])%mod;
 74         }
 75     }
 76     rep(i,0,k) ans=(ans+res[i]*b[i])%mod;
 77     if (ans<0)
 78         ans+=mod;
 79     return ans;
 80 }
 81 VI BM(VI s)
 82 {
 83     VI C(1,1),B(1,1);
 84     long long L=0,m=1,b=1;
 85     rep(n,0,SZ(s))
 86     {
 87         ll d=0;
 88         rep(i,0,L+1) d=(d+(ll)C[i]*s[n-i])%mod;
 89         if (d==0)
 90             ++m;
 91         else if (2*L<=n)
 92         {
 93             VI T=C;
 94             ll c=mod-d*powmod(b,mod-2)%mod;
 95             while (SZ(C)<SZ(B)+m)
 96                 C.pb(0);
 97             rep(i,0,SZ(B)) C[i+m]=(C[i+m]+c*B[i])%mod;
 98             L=n+1-L;
 99             B=T;
100             b=d;
101             m=1;
102         }
103         else
104         {
105             ll c=mod-d*powmod(b,mod-2)%mod;
106             while (SZ(C)<SZ(B)+m)
107                 C.pb(0);
108             rep(i,0,SZ(B)) C[i+m]=(C[i+m]+c*B[i])%mod;
109             ++m;
110         }
111     }
112     return C;
113 }
114 long long gao(VI a,ll n)
115 {
116     VI c=BM(a);
117     c.erase(c.begin());
118     rep(i,0,SZ(c)) c[i]=(mod-c[i])%mod;
119     return solve(n,c,VI(a.begin(),a.begin()+SZ(c)));
120 }
121 };
122
123 int main()
124 {
125     scanf("%lld", &n);
126     printf("%lld\n",linear_seq::gao(VI{0,0,3,30,195,1050,5103,23310,102315,437250},n-1));
127 }

原文地址:https://www.cnblogs.com/letlifestop/p/10836859.html

时间: 2024-08-02 11:05:47

小a的旅行计划(BM模板)的相关文章

cogs 2. 旅行计划 dijkstra+打印路径小技巧

2. 旅行计划 ★★   输入文件:djs.in   输出文件:djs.out   简单对比时间限制:3 s   内存限制:128 MB [题目描述] 过暑假了,阿杜准备出行旅游,他已经查到了某些城市的两两之间的距离及可行路线(可行路线有方向),如下图所示.请你编程计算从阿杜所住城市到其它城市的最短路径以帮助阿杜制定旅行计划. [输入格式] 输入由若干行组成,第一行有三个整数 n(1≤n≤100) 为城市数,m(1≤m≤n2) 为城市间道路数,s(0≤s≤n−1) 是阿杜所住城市.第 2 至 m

COGS 2. 旅行计划

2. 旅行计划 ★☆   输入文件:djs.in   输出文件:djs.out   简单对比时间限制:3 s   内存限制:128 MB 过暑假了,阿杜准备出行旅游,他已经查到了某些城市的两两之间的距离及可行路线(可行路线有方向),如下图所示.请你编程计算从阿杜所住城市到其它城市的最短路径以帮助阿杜制定旅行计划. [输入格式] 输入由若干行组成,第一行有三个整数,$n(1≤n≤100).m(1≤m≤n^2).v(1≤m≤n)$:城市数,$m$城市间道路数,$v$是阿杜所住城市.第$2$至$m+1

洛谷P1137 旅行计划

P1137 旅行计划 题目描述 小明要去一个国家旅游.这个国家有N个城市,编号为1-N,并且有M条道路连接着,小明准备从其中一个城市出发,并只往东走到城市i停止. 所以他就需要选择最先到达的城市,并制定一条路线以城市i为终点,使得线路上除了第一个城市,每个城市都在路线前一个城市东面,并且满足这个前提下还希望游览的城市尽量多. 现在,你只知道每一条道路所连接的两个城市的相对位置关系,但并不知道所有城市具体的位置.现在对于所有的i,都需要你为小明制定一条路线,并求出以城市i为终点最多能够游览多少个城

51nod 1273 旅行计划——思维题

某个国家有N个城市,编号0 至 N-1,他们之间用N - 1条道路连接,道路是双向行驶的,沿着道路你可以到达任何一个城市.你有一个旅行计划,这个计划是从编号K的城市出发,每天到达一个你没有去过的城市,并且旅途中经过的没有去过的城市尽可能的多(如果有2条路线,经过的没有去过的城市同样多,优先考虑编号最小的城市),直到所有城市都观光过一遍.现在给出城市之间的交通图T,以及出发地点K,你来设计一个旅行计划,满足上面的条件.例如: (K = 2) 第1天 从2到0 (城市 1 和 0 变成去过的) 第2

【csp模拟赛4】旅行计划 (travelling.cpp)--欧拉回路

[题目描述] 小 Z 打算趁着暑假,开启他的旅行计划.但与其他同学不同的是,小 Z 旅 行时并不关心到达了哪个网红景点打了哪些卡.小 Z 更关注沿路的风光,而且 小 Z 觉得,尽管多次到达同一个地方,但如果来时的路不一样,也是别有一番 风味. 小 Z 事先准备了一份地图,地图上给出了 N 个小 Z 心仪的城市,依次编号 1…N,以及 M 条连接两个城市的路,编号 1…M.小 Z 打算把 M 条路都走一遍且 仅一遍,但他发现这样的路线可能是不存在的.于是他打算,当他走到一个城 市后发现从这个城市出

NYOJ 小明的存钱计划

小明的存钱计划 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 小明的零花钱一直都是自己管理.每个月的月初妈妈给小明300元钱,小明会预算这个月的花销,并且总能做到实际花销和预算的相同. 为了让小明学习如何储蓄,妈妈提出,小明可以随时把整百的钱存在她那里,到了年末她会加上20%还给小明.因此小明制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果他预计到这个月的月末手中还会有多于100元或恰好100元,他就会把整百的钱存在妈妈那里,剩余的钱留在自己手中.

洛谷P1137 旅行计划 拓扑排序 图论

洛谷P1137 旅行计划 拓扑排序   图论在拓扑排序中把每个点能够浏览的点加上去 但是这样会有重复 因为我们要求一个点向前多能浏览的点 所以我们只要求连向这个点中能向前浏览的点数最多的点这一路就是能浏览的最多的点 然后这个点就相当于是拓扑排序中使该点的入度为 0 的那个点用那个点来更新当前点就行了 1 #include <bits/stdc++.h> 2 #define For(i,j,k) for(int i=j;i<=k;i++) 3 #define LL long long 4

小明的存钱计划 南阳acm54

小明的存钱计划 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 小明的零花钱一直都是自己管理.每个月的月初妈妈给小明300元钱,小明会预算这个月的花销,并且总能做到实际花销和预算的相同. 为了让小明学习如何储蓄,妈妈提出,小明可以随时把整百的钱存在她那里,到了年末她会加上20%还给小明.因此小明制定了一个储蓄计划:每个月的月初,在 得到妈妈给的零花钱后,如果他预计到这个月的月末手中还会有多于100元或恰好100元,他就会把整百的钱存在妈妈那里,剩余的钱留在自己手中.

剪纸风年终总结计划PPT模板

2019的脚步声越来越近,现在的你是徘徊在2018的总结还是踌躇在2019的展望?是希望在年终总结里充分展示自己?还是期待用2019的规划激励员工携手同行?在这样的愿景下,一份优秀的年终总结计划PPT模板怎能缺席? 这是一套2018剪纸风年终总结计划PPT,模板由办公资源打造,格式为 pptx ,大小 18.8MB ,页数为 33 , 比例为 16 : 9,适用于年终总结,工作汇报,新年计划等演讲,作品中的文字与图均可以修改和编辑. 原文地址:http://blog.51cto.com/1405