11.5

来源:互联网 发布:mac用pe安装win7系统 编辑:程序博客网 时间:2024/06/08 16:58

T1:解梦

测:70
费马小定理 a^(p-1)≡1 (mod p)解出

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>using namespace std;#define ll long long#define INF 1000000007ll a,b;ll mi(ll x,ll y,ll pa){  ll p=x,ans=1;//printf("%lld\n",pa);  while(y>0){    if(y&1)ans=(ans*p)%pa;    //printf("#%lld %lld\n",ans,p);    p=p*p%pa;    y=y>>1;  }  return ans%pa;}int main(){ int i,j; scanf("%lld%lld",&a,&b);printf("%lld\n",mi(a,mi(a,b-1,INF-1),INF)); return 0;}

T2:序列

测:50
对于前缀和为奇数的位置,它减去一个偶数便为奇数,减去一个正好比它小一点的偶数便是此位置结尾的最小正奇数。用set实现,边加入set边处理最小值,于是set中的元素肯定是在当前位置前的元素了。

考试时其实想出大部分,但是因为不知道set的用法,以及不知道处理大小与元素前后的关系,从而只能骗个分。

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#include<set>using namespace std;#define ll long long#define INF 300000*2000000000ll n,a[300005],s[300005];ll mn;int mni,mnj;struct node{ ll s,id; friend bool operator < (const node n1,const node n2){    return n1.s<n2.s; }}x;set <node> q1,q2;ll read(){ ll x=0,f=1; char ch=getchar();    while(ch<'0'||ch>'9'){      if(ch=='-')f=-1;      ch=getchar();    }    while(ch>='0'&&ch<='9'){      x=(x<<3)+(x<<1)+ch-'0';      ch=getchar();    }    return x*f;}int main(){ int i,j; n=read(); mn=INF;  for(i=1;i<=n;++i){    a[i]=read();  }  for(i=1;i<=n;++i){    s[i]=s[i-1]+a[i];  }  x.s=0;x.id=0;q2.insert(x);  for(i=1;i<=n;++i){    if(s[i]&1){        x.s=s[i];x.id=i;        q1.insert(x);        if(q2.empty())continue;        set <node> ::iterator xx=q2.lower_bound(x);        set <node> ::iterator yy=q2.begin();        if(xx==yy)continue;        --xx;        if(((x.s-(*xx).s)<mn)&&(x.s-(*xx).s>0)){            mn=x.s-(*xx).s;mni=(*xx).id+1;mnj=i;        }        else if((x.s-(*xx).s)==mn&&(*xx).id+1<mni){            mni=(*xx).id+1;mnj=i;        }    }    else{        x.s=s[i];x.id=i;        q2.insert(x);        if(q1.empty())continue;        set <node> ::iterator xx=q1.lower_bound(x);        set <node> ::iterator yy=q1.begin();        if(xx==yy)continue;        --xx;        if(((x.s-(*xx).s)<mn)&&(x.s-(*xx).s>0)){            mn=x.s-(*xx).s;mni=(*xx).id+1;mnj=i;        }        else if((x.s-(*xx).s)==mn&&(*xx).id+1<mni){            mni=(*xx).id+1;mnj=i;        }    }  }  if(mn!=INF)printf("%lld %d %d\n",mn,mni,mnj);  else printf("-1\n"); return 0;}
原创粉丝点击