[GDOIpj222A] 点指兵兵
第一题 点指兵兵
提交文件: bing.cpp
输入文件: bing.in
输出文件: bing.out
时间空间限制: 1 秒, 256 MB
你一定有过在两个物品之间犹豫不决的时候,想要借助一些方法帮你随机选择。在广东,有一种方法叫”点指兵兵”,即一开始用手指指向一个物品,然后念” 点指兵兵点到谁人做大兵”,从第二个字开始,每念一个字,手指就移动到另一个物品上。整句话念完,手指指向谁,你就选择谁。
但很快你就发现,这个方法是有问题的——你最终指向的物品一定是你一开始指向的物品,这严重破坏了这个方法的随机性。后来你学了信息学,你更加清楚这个规律了,咒语长度是奇数的时候最终指向跟初始指向相同,咒语长度是偶数的时候最终指向跟初始指向不同。
所以解决的方法有这么几种:
- 增加咒语长度,可以念一句很长很长的句子,长到你也数不清是奇数还是偶数。
- 增加物品数量,只有两个物品的话规律太多,多一些物品也就少一些规律。
因此现在你面对的问题是这样的:有若干个物品(至少 \(3\) 个)排成一圈,你要念一句长度为 \(n (n ≥ 3)\) 的咒语,一开始手指指向任意一个物品,从第二个字开始,每念一个字,手指移动到顺时针的下一个物品。如果最终指向的物品不是初始指向的物品,也不是与初始物品相邻的物品,那么就认为这个选择是比较随机的。
给定 \(n\),你想知道 \(3, \cdots , n\) 这些数字有多少个作为物品数量的时候,选择是比较随机的。
输入格式
本题每个测试点有多组测试数据。
第一行一个整数 T,表示数据组数。
接下来 T 行,每行一个整数 n,表示咒语长度。
输出格式
共 T 行,每行一个整数,表示有多少种可能的物品数量,使得这个咒语造成的选择是比较随机的。
样例数据
2
7
11
1
4
样例解释
n = 7 时,咒语可以是” 我爱 GDKOI”,只有物品数量为 4 时,最终指向物品不同于初始物品且不与初
始物品相邻。
n = 11 时,咒语可以是” 点指兵兵点到谁人做大兵”,物品数量为 4, 6, 7, 8 时符合要求。
数据范围
对于所有测试点,\(3 ≤ n ≤ 2 × 10^9,1 ≤ T ≤ 5\)。
| 测试点 | \(T ≤\) | \(n ≤\) | 特殊限制 |
|---|---|---|---|
| 1 ∼ 3 | 5 | $1000 $ | 无 |
| 4 ∼ 8 | 5 | \(10^5\) | 无 |
| 9 | 5 | $ 2 × 10^9$ | n 与 n − 2 都是质数 |
| 10 | 5 | $ 2 × 10^9$ | 无 |
首先考虑物品数量在什么条件下会不符合要求。很明显,如果\(n\equiv 0,1,2\pmod{x}\)时,\(x\)不合法。也就是说,如果\(x\)是\(n-1,n-2,n\)的因数,那么\(x\)不合法。由于\(n\)和\(n-2\)的差距为2,所以在\(3\cdots n\)中没有重复的因数。因数是成对出现的,所以排除掉一个x还要排除掉\(n-x\)。
但是还是要多排除一些可能。首先如果\(n\)是偶数,排除\(n\div2\)和\((n-2)\div2\),否则排除\((n-1)\div2\),还要排除\(n,n-1,n-2\)三个数本身。
方法在\(n\le6\)时会排除出现重复,所以要特判。
#include<cstdio>
const int M=6e6+5;
int t,n,cnt;
void calc(int x,int y)
{
if(!(y%x))
{
if(x*x==y)
++cnt;
else
cnt+=2;
}
}
int main()
{
// freopen("bing.in","r",stdin);
/// freopen("bing.out","w",stdout);
scanf("%d",&t);
while(t--)
{
scanf("%d",&n),cnt=0;
if(n<7)
{
printf("0\n");
continue;
}
for(int i=3;i*i<=n;i++)
{
calc(i,n);
calc(i,n-1);
calc(i,n-2);
}
if(n%2==0)
cnt+=2;
else
cnt++;
printf("%d\n",n-5-cnt);
}
return 0;
}
[GDOIpj222A] 点指兵兵的更多相关文章
- 【总结】2022GDOI普及组试题与题解(缺两天的T4)
标签 2022 广东省选普及组 GDOI 试题 前往Luogu下载 Luogu下载:This Day1题解 T1 邹忌讽齐王纳谏 打卡题,建议模拟 建议使用map,时间复杂度为\(O(nlogn)\) ...
随机推荐
- AI绘画:Stable Diffusion 终极炼丹宝典:从入门到精通
本文收集于教程合集:AIGC从入门到精通教程汇总 我是小梦,以浅显易懂的方式,与大家分享那些实实在在可行之宝藏. 历经耗时数十个小时,总算将这份Stable Diffusion的使用教程整理妥当. 从 ...
- 怎么选择API接口来获取自己想要的数据
在今天的数字时代,数据变得越来越重要,API接口也成为了获取数据的一种重要方式.无论是开发自己的应用程序还是进行市场营销,数据的获取都是非常必要的.但是,如何选择API接口来获取自己想要的数据呢? 以 ...
- 杰哥教你面试之一百问系列:java中高级多线程concurrent的使用
目录 问题1:什么是ConcurrentHashMap?它与HashMap的区别是什么? 问题2:什么是CopyOnWriteArrayList?它适用于什么样的场景? 问题3:什么是Blocking ...
- Github工具库
0x01 漏洞练习平台 WebGoat漏洞练习平台: https://github.com/WebGoat/WebGoat webgoat-legacy漏洞练习平台: https://github.c ...
- MySQL实战实战系列 01 基础架构:一条SQL查询语句是如何执行的?
这是专栏的第一篇文章,我想来跟你聊聊 MySQL 的基础架构.我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题.同样,对于 MySQL 的学习也是这样. ...
- 造轮子之asp.net core identity
在前面我们完成了应用最基础的功能支持以及数据库配置,接下来就是我们的用户角色登录等功能了,在asp.net core中原生Identity可以让我们快速完成这个功能的开发,在.NET8中,asp.ne ...
- oracle命令3 冷备份
用户管理的备份:备份脚本要自己写:备份哪些文件要自己选:恢复时要复制那些文件自己判断:恢复需要的日志,自己找: 备份,需要备份保存关键SCN信息的文件:一次完成的备份包括:控制文件,数据文件,日志文件 ...
- python学习笔记(持续更新)
一.对列表的操作 #建立一个列表 list = [1,2,3,4] #打印列表 print(list) #在列表尾部添加元素 list.append(5) #在指定位置插入元素 list.insert ...
- 《最新出炉》系列初窥篇-Python+Playwright自动化测试-24-处理单选和多选按钮-上篇
1.简介 在工作和生活中,经常会遇到我们需要进行选择的情况,比如勾选我们选择性别,男女两个性别总是不能同时选中的,再比如我们在选择兴趣爱好时,我们可以选择多个自己感兴趣的话题,比如:篮球.足球.电竞等 ...
- HTTP 和 RPC 的区别
一句话概括 RPC代表:Feign.Dubbo RPC 主要用于公司内部的服务调用,性能消耗低,传输效率高,服务治理方便. HTTP 代表:RestTemplate.HttpClient HTTP 主 ...