zoukankan      html  css  js  c++  java
  • LOJ #10041「一本通 2.1 练习 7」门票 题解

    题目大意:

    给定一个数列 ({a_n},a_0=1,a_{i+1}=(A imes a_i+a_imod B)mod C),求这个数列第一次出现重复的项的标号。

    Sol:

    哈希表模板题。
    模数随便设,(2000003) 实际效果比较好,跑得挺快。
    每次计算一下数列里新的项的值,插入到哈希表里。同时再判断是否重复。
    有一个小坑,就是第一项的 (1) 也要插入进去。

    Code:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxN = 2000005;
    #define int long long
    #define P 2000003
    struct node {
    	int v, nxt;
    }rec[maxN];
    int A, B, C, hd[maxN];
    namespace HASH {
    	int tot;
    	int H(int x) {
    		return x%P;
    	}
    	bool add(int x, int v) {
    		for(int i = hd[x]; i; i = rec[i].nxt)
    			if(rec[i].v == v) return true;
    		rec[++tot].v = v;
    		rec[tot].nxt = hd[x];
    		hd[x] = tot;
    		return false;
    	}
    }
    using HASH::H;
    using HASH::add;
    signed main() {
    	freopen("ticket.in", "r", stdin);
    	freopen("ticket.out", "w", stdout);
    	cin >> A >> B >> C;
    	int x = 1;
    	add(1, 1);
    	for(int i = 1; i <= 2000000; i++) {
    		x = (x*A+x%B)%C;
    		if(add(H(x), x)) {
    			cout << i;
    			return 0;
    		}
    	}
    	cout << -1;
    	return 0;
    }
    
  • 相关阅读:
    学习进度三
    开课博客之个人介绍
    个人作业--数组
    学习进度二
    开学第一次测试
    实现点击不同的按钮加载不同的css
    Web存储
    HTML5(常用的表单控件)
    JS(获得当前时间并且用2015-01-01格式表示)
    JS(event事件)
  • 原文地址:https://www.cnblogs.com/Xray-luogu/p/11569669.html
Copyright © 2011-2022 走看看