[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)\) ...
随机推荐
- .NET周刊【8月第4期 2023-08-27】
国内文章 AgileConfig-1.7.0 发布,支持 SSO https://www.cnblogs.com/kklldog/p/agileconfig-170.html AgileConfig ...
- 自定义注解实现数据序列化时进行数据脱敏(基于springboot默认jackjson)、消息转换器HttpMessageConverter
消息转换器 HttpMessageConverter 消息转化器的作用 将请求报文转化为Java对象 将Java对象转化为响应报文 消息转换器接口 public interface HttpMessa ...
- ContentPresenter使用DataTemplate
在使用自定义样式内容时,有时也需要在自定义样式中绑定一下数据模板 可以使用ContentPresenter的ContentTemplate绑定定义好的资源 DateTemplate 用法代码如下 &l ...
- Blazor前后端框架Known-V1.2.16
V1.2.16 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行. Gitee: https://gitee.com/known/Known Git ...
- Java 队列Queue的一些基本操作与概念!!!!!!!!
首先Java中的队列(Queue)是一种先进先出的数据结构. 其中常见的一些基本操作与方法,包括: 1.创建队列对象.例如:ArrayDeque.LinkedList等. 2.入队操作.将元素添加到队 ...
- 【createWrapper】根据条件类创建查询wrapper
前几天写一个有几十个字段的查询wrapper,写得我心烦意乱.然后就琢磨了一下能不能只传一个条件类对像就能创建对应的wrapper.去看了下mybatis-plus的文档没看到合适的api,有一个创建 ...
- HDU1702 ACboy needs your help again! 题解
#include <iostream> #include <string> #include <queue> #include <stack> usin ...
- VS Code C# 开发工具包正式发布
前言 微软于本月正式发布Visual Studio Code C#开发工具包,此前该开发套件已经以预览版的形式在6月份问世.经过4个月的测试和调整,微软修复了350多个问题,其中大部分是用户反馈导致的 ...
- NanoPI常用命令
更新 sudo apt-get update 安装 CURL sudo apt install curl
- MVC开发
我们通过前面的章节可以看到:https://www.liaoxuefeng.com/wiki/1252599548343744/1266264917931808 Servlet适合编写Java代码,实 ...