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

 

posted @ 2016-10-24 16:01  神犇(shenben)  阅读(163)  评论(0编辑  收藏  举报