标签:cnt int cin long while 寒假 2022 集训 mod
【记录一下自己的错误】
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;
}
标签:cnt,int,cin,long,while,寒假,2022,集训,mod 来源: https://blog.csdn.net/zy98zy998/article/details/122711997
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。