CSUSTOJ-藤原书记的佩斯(简单数学)

题目连接:http://acm.csust.edu.cn/problem/4056
博客园食用链接: https://www.cnblogs.com/lonely-wind-/p/13941868.html

Description

藤原书记家养了一只金毛的佩斯,佩斯有着能和白银匹敌的智商,并且非常喜欢数学和编程。

这天佩斯在外面玩耍的时候碰到了一圈石头, 总共有 n n n 个 ,它把这 n n n 个石头从 0 0 0 n − 1 n - 1 n1 顺时针编号,现在佩斯处于第 0 0 0 号石头上,佩斯会在石头上顺时针跳跃,并且每次跳的距离固定为 k k k ,假设佩斯当前的位置的石头编号为 p o s pos pos ,那么它下一块所处的石头编号为 ( p o s + k ) % n (pos + k) \% n (pos+k)%n。比如当 n = 12 , k = 4 n = 12, k = 4 n=12,k=4 时,佩斯所处石头的编号按跳跃顺序则是 0 , 4 , 8 , 0 , 4.... 0, 4, 8, 0, 4.... 0,4,8,0,4.... ,它会无穷无尽一直跳下去。佩斯记录下了它从开始游戏后经过的所有石头的编号集合(不含重复编号),但一不小心忘记了编号原本的出现顺序。它想请你计算出有多少个符合条件的 k k k 能使得它最终经过的编号集合与所记录的吻合。

注:编号集合中不含重复元素,只要两个编号集合内的元素相同(不考虑顺序),即说明二者吻合。

input

第一行输入 n , m n,m n,m,满足 2 ≤ m ≤ n ≤ 100000 2≤m≤n≤100000 2mn100000

第二行 m m m个整数,代表得到的石头编号,满足第 i i i 个整数 0 ≤ a i ≤ n − 1 , a i ≥ a i − 1 0≤a_i≤n-1,a_i≥a_{i-1} 0ain1aiai1

output

输出一个整数,代表有多少个符合条件的 k k k 能使得它最终经过的编号集合与所记录的吻合。

题目保证有解。

Sample Input 1
5 5
0 1 2 3 4
Sample Output 1
4

Sample Input 2
6 3
0 2 4
Sample Output 2
2

emmm,这是一个环,那么对于每一个长度 1 − ( n − 1 ) 1-(n-1) 1(n1)我们肯定能够找到其循环节,并求出其循环节的长度,那么这个循环节的长度实际上就是最终能够构成的序列的长度。于是就可以筛出一大部分的答案了,那么对于有些数可能有相同的循环节长度,但其序列可能不同,所以我们只要将给定的序列打上标记,对这些已经筛出来的数 x x x,判断是否有 v i s [ x ] vis[x] vis[x]存在,如果有,那么就说明了这个循环节上有这个数,那么其循环节就固定了。

至于循环节的长度,我们直接求一个最小公倍数lcm就可以了, l c m ( a , b ) = a / g c d ( a , b ) ∗ b lcm(a,b)=a/gcd(a,b)*b lcm(a,b)=a/gcd(a,b)b

以下是AC代码:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int mac=1e5+10;

int vis[mac];

int main(int argc, char const *argv[])
{
	int n,m;
	scanf ("%d%d",&n,&m);
	for (int i=1; i<=m; i++){
		int x;
		scanf ("%d",&x); 
		vis[x]=1;
	}
	int ans=0;
	for (int i=1; i<n; i++){
		ll lcm=1ll*n/__gcd(i,n)*i;
		if (lcm/i==m && vis[i]) ans++;
	}
	printf("%d\n",ans);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值