其他分享
首页 > 其他分享> > 点指兵兵

点指兵兵

作者:互联网

第一题 点指兵兵
提交文件: bing.cpp
输入文件: bing.in
输出文件: bing.out
时间空间限制: 1 秒, 256 MB
你一定有过在两个物品之间犹豫不决的时候,想要借助一些方法帮你随机选择。在广东,有一种方法叫”点指兵兵”,即一开始用手指指向一个物品,然后念” 点指兵兵点到谁人做大兵”,从第二个字开始,每念一个字,手指就移动到另一个物品上。整句话念完,手指指向谁,你就选择谁。

但很快你就发现,这个方法是有问题的——你最终指向的物品一定是你一开始指向的物品,这严重破坏了这个方法的随机性。后来你学了信息学,你更加清楚这个规律了,咒语长度是奇数的时候最终指向跟初始指向相同,咒语长度是偶数的时候最终指向跟初始指向不同。

所以解决的方法有这么几种:

给定 \(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;
}

标签:10,指向,int,bing,指兵兵,物品,咒语
来源: https://www.cnblogs.com/mekoszc/p/16203895.html