隐藏页面特效

20161024模拟

总结:

 

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代码(暂缺)

 


__EOF__

本文作者shenben
本文链接https://www.cnblogs.com/shenben/p/5993350.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   神犇(shenben)  阅读(164)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示