11.5

T1:解梦

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

#include
#include
#include
#include
#include
using namespace std;
#define ll long long
#define INF 1000000007
ll 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
#include
#include
#include
#include
#include
using namespace std;
#define ll long long
#define INF 300000*2000000000
ll 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.sset  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  ::iterator xx=q2.lower_bound(x);
        set  ::iterator yy=q2.begin();
        if(xx==yy)continue;
        --xx;
        if(((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+11;mnj=i;
        }

    }
    else{
        x.s=s[i];x.id=i;
        q2.insert(x);
        if(q1.empty())continue;
        set  ::iterator xx=q1.lower_bound(x);
        set  ::iterator yy=q1.begin();
        if(xx==yy)continue;
        --xx;
        if(((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+11;mnj=i;
        }
    }
  }
  if(mn!=INF)printf("%lld %d %d\n",mn,mni,mnj);
  else printf("-1\n");
 return 0;
}

你可能感兴趣的:(做题总结)