- 题解
《10.6训练赛》题解
- 2022-10-6 21:41:39 @
A 被封印的黑白熊
开 数组 / 结构体数组 记录一下,然后倒着判断点是否在范围内即可
B 时间管理大师wulong
数据范围较小,可以直接暴力跑,每询问一次就跑一边记住的M个
或者用标记+今天上午讲的队列(有兴趣的试一试)
C 圈圈又菜又爱玩
数据范围较小,同样可以直接暴力跑,while循环+标记跑100 * 100不是问题
D 小a跳圈圈
可以直接跑n次看每一个有没有都踩到 或者找规律,只有n是2的任意次方能yes
E yq和咩咩的博弈游戏
此题因为数据量过大,在1e7的范围内需要进行最多2e5次判断,所以此题我们需要进行预处理,仿照素数筛筛出一定范围内所有条件的数,但接下来查找量也很大,并且我们筛剩下的数是按顺序排的,所以我们只需要将之前筛剩下来的数放进一个新的数组,就可以进行二分查找,加快查找速率
(by 小萍萍友情提供)
//标程
#include <bits/stdc++.h>
using namespace std;
const int M = 1e7+1000;
bool q[M];
int num[M],n,cnt;
int check(int x)//判断是否含7
{
while(x)
{
if(x%10==7) return 1;
x /= 10;
}
return 0;
}
void init()
{
for(int i=1;i<=M-10;i++) {//-10无所谓,少点时间
if(q[i]==0&&check(i)) {//未标记且非目标
for(int j=i;j<=M-10;j+=i) q[j] = 1;//非目标及其倍数标记
}
}
for(int i=1;i<=M-10;i++) if(q[i]==0) num[++cnt] = i;//将目标数放入新数组
}
void solve()
{
scanf("%d",&n);
if(q[n]) {//输入的数本身不合法
cout<<(-1)<<endl;
return ;
}
int l = 1,r = cnt;
while(l<r) {//二分板子
int mid = (l+r)/2;
if(num[mid]>n) r = mid;
else l = mid+1;
}
printf("%d\n",num[l]);
}
int main()
{
int T = 1;
init();
cin>>T;
while(T--)
{
solve();
}
return 0;
}
nylg赢麻了,xqh输麻了
异或符号是 ^ 这个,好在全写出来了,不然我就麻了
刘桑のSakura(emo版)
遍历遇到emo直接跳过就行
刘桑のSakura(快速版)
纯快速幂板子,没写出来好好理解一下快速幂怎么实现的
long long qpow(long long a,long long b,long long mod)
{
a=a%mod;//防止a过大
long long res=1;
while(b){
if(b&1) res=res*a%mod;
a=a*a%mod;
b>>=1;//右移相当于/2
}
return res;
}
0 comments
No comments so far...