zoukankan      html  css  js  c++  java
  • CSUSTOJ-藤原书记的佩斯(简单数学)

    题目连接:http://acm.csust.edu.cn/problem/4056
    CSDN食用链接:https://blog.csdn.net/qq_43906000/article/details/109455043

    Description

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

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

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

    input

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

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

    output

    输出一个整数,代表有多少个符合条件的 (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))我们肯定能够找到其循环节,并求出其循环节的长度,那么这个循环节的长度实际上就是最终能够构成的序列的长度。于是就可以筛出一大部分的答案了,那么对于有些数可能有相同的循环节长度,但其序列可能不同,所以我们只要将给定的序列打上标记,对这些已经筛出来的数(x),判断是否有(vis[x])存在,如果有,那么就说明了这个循环节上有这个数,那么其循环节就固定了。

    至于循环节的长度,我们直接求一个最小公倍数lcm就可以了,(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
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    get和post区别
    cookie和session的区别
    节流和防抖
    eval()
    三次握手和四次挥手
    HTTP状态码
    AMD规范与CMD规范的区别?
    深拷贝和浅拷贝
    逆人性的人类出现,正常合理竞争该何去何从
    TestNG并发执行测试总结
  • 原文地址:https://www.cnblogs.com/lonely-wind-/p/13941868.html
Copyright © 2011-2022 走看看