【记录一下自己的错误】
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;
}