第一题 点指兵兵

提交文件: 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] 点指兵兵的更多相关文章

  1. 【总结】2022GDOI普及组试题与题解(缺两天的T4)

    标签 2022 广东省选普及组 GDOI 试题 前往Luogu下载 Luogu下载:This Day1题解 T1 邹忌讽齐王纳谏 打卡题,建议模拟 建议使用map,时间复杂度为\(O(nlogn)\) ...

随机推荐

  1. AI绘画:Stable Diffusion 终极炼丹宝典:从入门到精通

    本文收集于教程合集:AIGC从入门到精通教程汇总 我是小梦,以浅显易懂的方式,与大家分享那些实实在在可行之宝藏. 历经耗时数十个小时,总算将这份Stable Diffusion的使用教程整理妥当. 从 ...

  2. 怎么选择API接口来获取自己想要的数据

    在今天的数字时代,数据变得越来越重要,API接口也成为了获取数据的一种重要方式.无论是开发自己的应用程序还是进行市场营销,数据的获取都是非常必要的.但是,如何选择API接口来获取自己想要的数据呢? 以 ...

  3. 杰哥教你面试之一百问系列:java中高级多线程concurrent的使用

    目录 问题1:什么是ConcurrentHashMap?它与HashMap的区别是什么? 问题2:什么是CopyOnWriteArrayList?它适用于什么样的场景? 问题3:什么是Blocking ...

  4. Github工具库

    0x01 漏洞练习平台 WebGoat漏洞练习平台: https://github.com/WebGoat/WebGoat webgoat-legacy漏洞练习平台: https://github.c ...

  5. MySQL实战实战系列 01 基础架构:一条SQL查询语句是如何执行的?

    这是专栏的第一篇文章,我想来跟你聊聊 MySQL 的基础架构.我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题.同样,对于 MySQL 的学习也是这样. ...

  6. 造轮子之asp.net core identity

    在前面我们完成了应用最基础的功能支持以及数据库配置,接下来就是我们的用户角色登录等功能了,在asp.net core中原生Identity可以让我们快速完成这个功能的开发,在.NET8中,asp.ne ...

  7. oracle命令3 冷备份

    用户管理的备份:备份脚本要自己写:备份哪些文件要自己选:恢复时要复制那些文件自己判断:恢复需要的日志,自己找: 备份,需要备份保存关键SCN信息的文件:一次完成的备份包括:控制文件,数据文件,日志文件 ...

  8. python学习笔记(持续更新)

    一.对列表的操作 #建立一个列表 list = [1,2,3,4] #打印列表 print(list) #在列表尾部添加元素 list.append(5) #在指定位置插入元素 list.insert ...

  9. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-24-处理单选和多选按钮-上篇

    1.简介 在工作和生活中,经常会遇到我们需要进行选择的情况,比如勾选我们选择性别,男女两个性别总是不能同时选中的,再比如我们在选择兴趣爱好时,我们可以选择多个自己感兴趣的话题,比如:篮球.足球.电竞等 ...

  10. HTTP 和 RPC 的区别

    一句话概括 RPC代表:Feign.Dubbo RPC 主要用于公司内部的服务调用,性能消耗低,传输效率高,服务治理方便. HTTP 代表:RestTemplate.HttpClient HTTP 主 ...