计蒜客 2020 蓝桥杯大学 B 组省赛模拟赛(一)寻找重复项

题目描述:

有一个数列 {a_{n}​},​a_{0} = 1a_{i+1} = (A\times a_{i} + a_{i} mod B)modC,请你编程求出这个数列第一次出现重复的项的标号。如果答案超过 2000000 输出 "-1"(不加引号)

输入格式

第一行三个整数 A,B,C。

输出格式

输出一行一个整数表示答案。

数据范围

对于 30% 的数据: 0<A,B,C≤10^{5} 。

对于 100% 的数据: 0<A,B,C≤10^{9}

样例输入

2 2 9

样例输出

4

 解题报告:

1:用map会超时,可以用unordered_map来标记。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
unordered_map<ll, ll>node;
int main(){
    ll a, b, c, pre = 1;
    scanf("%lld%lld%lld", &a, &b, &c);
    node[1] = 1;
    for(ll i=1; i<=2000000; ++i){
        ll val = (a*pre+pre%b)%c;
        if(node[val]){
            printf("%lld\n", i);
            return 0;
        }
        pre = val, node[val] = 1;
    }
    printf("-1\n");
    return 0;
}
发布了110 篇原创文章 · 获赞 2 · 访问量 4986

猜你喜欢

转载自blog.csdn.net/jun_____/article/details/104040368