
尼玛pdf依旧不会粘23333
/*
每段合并到总的里面
假设总的有X个 这一段有Y个
一共有X+1个空 那么就有
C(X+1,1)+C(X+1,2)+C(X+1,3)+...+C(X+1,Y)
这样是WA的!!!
比如说 C(X+1,2) 那就是Y个放到两个空里
分别放几个...忘了算了23333
自己就想到这里 Wa了 10分
(暴力40 吐血了)
*/
#include<iostream>
#include<cstdio>
#define maxn 1010
#define mod 1000000007
#define ll long long
using namespace std;
ll n,m,a[maxn],f[maxn],len[maxn],c[maxn][maxn],ans=;
ll init(){
ll x=,f=;char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x*f;
}
void Get_c(){
for(int i=;i<=n;i++)c[i][]=;
for(int i=;i<=n;i++)
for(int j=;j<=i;j++)
c[i][j]=c[i-][j]+c[i-][j-];
}
ll G(ll x,ll y){
ll sum=;
for(ll i=;i<=y;i++)
sum+=c[x+][i];
return sum;
}
int main()
{
freopen("*.in","r",stdin);
freopen("*.out","w",stdout);
n=init();m=init();
for(int i=;i<=m;i++){
ll x=init();f[x]=;
}
Get_c();
ll sum=;f[n+]=;
for(int i=;i<=n+;i++){
if(!f[i])sum++;
else {
len[++len[]]=sum;sum=;
}
}
sum=len[];
for(int i=;i<=len[];i++){
ans=ans*G(sum,len[i]);
ans%=mod;sum+=len[i];
}
for(int i=;i<len[];i++){
ans=ans*(<<len[i]-);
ans%=mod;
}
cout<<ans<<endl;
}
/*
同桌想到了更简单的方法
合并的方案数有(n-m)!/(πlen[i]!)
证明吗 我们联想 4个红球 3个黑球 5个蓝球
放在一起的方案数 (4+3+5)!/(4!*3!*5!)
就是把一样的颜色删掉
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100010
#define mod 1000000007
#define inf 1e10
#define ll long long
using namespace std;
ll n,m,a[maxn],f[maxn],ans=,len[maxn],c[maxn],prime[maxn],num;
ll init(){
ll x=,f=;char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x*f;
}
void Prime(){
for(int i=;i<=n;i++){
if(f[i]==)prime[++num]=i;
for(int j=;j<=num;j++){
if(i*prime[j]>n)break;
f[i*prime[j]]=;
if(i%prime[j]==)break;
}
}
}
void J(ll x){
for(int i=;i<=num;i++){
ll P=prime[i];
while(P<=n){
c[i]+=x/P;
P*=prime[i];
}
}
}
void JJ(ll x){
for(int i=;i<=num;i++){
ll P=prime[i];
while(P<=n){
c[i]-=x/P;
P*=prime[i];
}
}
}
ll Pow(ll x,ll y){
ll r=;
for(int i=;i<=y;i++)
r=r*x,r%=mod;
return r;
}
int main()
{
freopen("*.in","r",stdin);
freopen("*.out","w",stdout);
n=init();m=init();
for(int i=;i<=m;i++){
ll x=init();f[x]=;
}
ll sum=;f[n+]=;
for(int i=;i<=n+;i++){
if(!f[i])sum++;
else {
len[++len[]]=sum;sum=;
}
}
memset(f,,sizeof(f));
Prime();J(n-m);
for(int i=;i<=len[];i++)
JJ(len[i]);
for(int i=;i<len[];i++){
ans=ans*Pow(,len[i]-);
ans%=mod;
}
for(int i=;i<=n;i++)
ans=ans*Pow(prime[i],c[i]),ans%=mod;
cout<<ans<<endl;
return ;
}
#include<iostream>
#include<cstdio>
#include<algorithm>
#define maxn 100010
#define inf 1e18
#define ll long long
using namespace std;
ll n,m,p[maxn],c[maxn],ans;
ll init(){
ll x=,f=;char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x*f;
}
bool Judge(ll x){
for(int j=,i=;i<=n;i++){
if(p[i]-c[j]>x)return ;
ll R=;
if(c[j]<p[i])R=max(x-(p[i]-c[j])+c[j],(x+p[i]+c[j])/);
else R=p[i]+x;
while(j<=m+&&R>=c[j])j++;
if(j>m)return ;
}
return ;
}
int main()
{
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
n=init();m=init();
for(int i=;i<=n;i++)p[i]=init();
for(int i=;i<=m;i++)c[i]=init();
ll l=,r=inf;
while(l<=r){
ll mid=l+r>>;
if(Judge(mid)){
r=mid-;ans=mid;
}
else l=mid+;
}
cout<<ans<<endl;
return ;
}
/*暴力没调出来 输出了不修改的 然而没数据 过几天再改吧*/
#include<cstdio>
#include<cstring>
#include<iostream>
#define maxn 100010
#define inf 100000000
#define ll long long
using namespace std;
ll n,m,num,head[maxn],len[maxn],C,f[maxn];
struct node{
ll v,t,pre,o;
}e[maxn*];
struct edge{
ll u,v,t;
}p[maxn];
ll init(){
ll x=,f=;char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x*f;
}
ll min(ll x,ll y){
return x>y?x:y;
}
void Add(ll from,ll to,ll dis,ll fal){
num++;e[num].v=to;
e[num].t=dis;
e[num].o=fal;
e[num].pre=head[from];
head[from]=num;
}
ll Dfs(ll now,ll from){
ll s=;f[now]=;
for(ll i=head[now];i;i=e[i].pre){
ll v=e[i].v;
if(v!=from&&i!=C)s+=Dfs(v,now);
}
return s;
}
ll Get(){
ll sum=;
for(ll i=;i<=m;i++){
ll l=Dfs(p[i].u,p[i].v);
ll r=Dfs(p[i].v,p[i].u);
len[i]=l*r*p[i].t;sum+=len[i];
}
return sum;
}
ll Solve(ll u,ll v,ll x){
C=x;memset(f,,sizeof(f));m++;
Add(u,v,p[x].t,n);Add(v,u,p[x].t,n);
ll sum=Get();for(ll i=;i<=n;i++)
if(f[i]==)return inf;
num-=;m--;return sum;
}
int main()
{
//freopen("road.in","r",stdin);
//freopen("road.out","w",stdout);
n=init();ll u,v,t;m=n-;
for(ll i=;i<n;i++){
u=init();v=init();t=init();
p[i].u=u;p[i].v=v;p[i].t=t;
Add(u,v,t,i);Add(v,u,t,i);
}
ll mx=Get();
/*for(ll i=1;i<=n;i++)
for(ll j=i+1;j<=n;j++)
for(ll k=1;k<=m;k++){
mx=min(mx,Solve(i,j,k));
}*/
cout<<mx<<endl;
return ;
}