2022寒假集训2 A题、H题

【记录一下自己的错误】

A题

小沙的炉石n,m范围1E18

普通数学题:最小是1+3+5+……=t*t,最大是(m+1+m+t)*t/2;

判断是否在区间里的话,把x求根号就可以了;但是在min(m+1,n)这里没开long long,WA了;

警告⚠:开long long!!!!!!!!

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,m;cin>>n>>m;
    long long t=min(m+1,n);
    long long maxx=(m+1+m+t)*t/2;
    int k;cin>>k;
    while(k--){
    long long x;cin>>x;
    if(maxx<x){puts("NO");continue;}//超出极限了
    long long temp=sqrt(x);//发动攻击的次数
    long long minn=temp*temp; //下限
    long long xmaxx=(m+1+m+temp)*temp/2;//上限    
    if(xmaxx>=x&&x>=minn){puts("YES");continue;}
    else puts("NO");
    }
    return 0;
}

H题

小沙的数数 n、m范围1E18;

一开始脑子不好使,没用快速幂做,写了一个极其奇怪的代码,但是n没取mod,于是WA了;

警告⚠:取模的时候n,m也要取模!!!!!!!!

#include<bits/stdc++.h>
using namespace std;
bool sum[50];
int mod=1E9+7;
int main()
{
    long long m;long long n;
    cin>>n>>m;n%=mod;//拜托!n记得要取模!!!!!!!!
    int cnt=1; while(m){if(m&1)sum[cnt]=1;cnt++;m=m/2;}
    cnt--;
    long long s=1;
    while(cnt){if(sum[cnt]){s=s*n%mod;}cnt--; }
    cout<<s;
    return 0;
}

赛后反思用快速幂模板的简单代码:

#include<bits/stdc++.h>
using namespace std;
bool sum[50];
int mod=1E9+7;
long long binpow(long long a,long long b,long long m) {
  a%=m;
  long long res=1;
  while (b>0) {
    if (b&1)res=(__int128)res*a%m;
    a=(__int128)a*a%m;
    b>>=1;
  }
  return res;
}
int main()
{
    long long m;long long n;
    cin>>n>>m;n%=mod;
    int cnt=0;while(m){if(m&1)cnt++;m=m/2;}
    cout<<binpow(n,cnt,mod);
    return 0;
}

上一篇:Excel 生成sql语句


下一篇:Kolla 4.0.0环境下VIP无法迁移问题排查