总结:
T1 数论+模拟
累乘
(两头是1)
(在mod 1e9+7意义下)
T2 最大值最小->二分答案
(过可以到达的最远点进行二分)
T3 不会啊
T1代码(100分)
#include<cstdio> #include<cmath> #include<algorithm> #define ll long long using namespace std; const int N=1e5+10; const int mod=1e9+7; ll n,m,sum,ha,cnt,w[N],t[N],prime[N]; bool check[N]; inline void first(){ for(int i=2;i<=n;i++){ if(!check[i]) prime[++sum]=i; for(int j=1;j<=sum&&prime[j]*i<=n;j++){ check[i*prime[j]]=1; if(i%prime[j]==0) break; } } } pair<ll,ll> a[N]; ll Fpow(ll a,ll p){ ll res=1; for(;p;p>>=1,a=a*a%mod) if(p&1) res=res*a%mod; return res; } int main(){ freopen("lantern.in","r",stdin); freopen("lantern.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%d",&w[i]); sort(w+1,w+m+1); first(); if(w[1]>1) a[++cnt]=make_pair(w[1]-1,1); if(w[m]<n) a[++cnt]=make_pair(n-w[m],1); for(int i=2,l;i<=m;i++){ if((l=w[i]-w[i-1]-1)>0){ a[++cnt]=make_pair(l,Fpow(2,l-1)); } } for(int j=1;j<=sum;j++){ ha=n-m; if(ha<prime[j]) break; while(ha){ t[j]+=ha/prime[j]; ha/=prime[j]; } } for(int i=1;i<=cnt;i++){ for(int j=1;j<=sum;j++){ ha=a[i].first; if(ha<prime[j]) break; while(ha){ t[j]-=ha/prime[j]; ha/=prime[j]; } } } ll ans=1; for(int i=1;i<=sum;i++){ ans=(ans%mod*Fpow(prime[i],t[i])%mod)%mod; } for(int i=1;i<=cnt;i++) ans=ans*a[i].second%mod; printf("%I64d",ans); return 0; }
T2代码(100分)
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long #ifdef unix #define LL "%lld" #else #define LL "%I64d" #endif using namespace std; const int N=1e5+10; const ll inf=1e15+10; int n,m; bool vis[N]; ll a[N],b[N],link[N]; inline const ll read(){ register ll x=0; register char ch=getchar(); while(ch<'0'||ch>'9') ch=getchar(); while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar(); return x; } inline bool check(ll mid){ for(ll i=1,j=1,rest,reach;i<=n;i++){ if(a[i]-b[j]>mid) return 0; if(a[i]>b[j]){ rest=mid-(a[i]-b[j]); reach=max(b[j]+rest,a[i]+rest/2); } else reach=a[i]+mid; while(b[j]<=reach&&j<=m) j++; if(j>m) return 1; } return 0; } int main(){ freopen("read.in","r",stdin); freopen("read.out","w",stdout); n=read();m=read(); for(int i=1;i<=n;i++) a[i]=read(); for(int i=1;i<=m;i++) b[i]=read(); ll l=0,r=inf,mid; while(l<r){ mid=l+r>>1; if(check(mid)) r=mid; else l=mid+1; } printf(LL,l); return 0; }
T3代码(暂缺)