zoukankan      html  css  js  c++  java
  • 【hash表】门票

    问题 I: 【哈希和哈希表】门票

    题目描述

    RPK要带MSH去一个更加神秘的地方!
    RPK带着MSH穿过广场,在第1618块砖上按下了一个按钮,在一面墙上随即出现了一个把手。RPK握住把手,打开了一扇石质大门。他们穿过悠长而芬芳的小道,走到了一扇象征时间的大门――“the gate of time”。
    门上写着一个关于时间的谜题“承诺:____年”,RPK思考了一会,从容地用手指写下1万,这时,门开始发出闪光,MSH感觉到自己的心跳都快停止了。
    门开了,眼前是一座美丽的神秘花园!
    正当RPK和MSH准备进入的时候,突然出现了一个看门的老大爷QL。
    QL:“你们干什么你们,还没买票呢!”
    RPK突然想起来现金全拿去买蛋糕了,RPK很绅士的问:“能刷卡么?我身上没现金。”
    QL:“没钱?那你们不能进去!”
    RPK(汗):“……”
    QL:“等等,我这有道不会的数学题,你解了我就让你们进去。”
    (众人:“……”)
    有一个数列{an},a0=1,ai+1=(A*ai+ai mod B)mod C,要求这个数列第一次出现重复的项的标号。
    这点小问题当然难不倒数学bug男RPK了,仅凭心算他就得到了结果。

    输入

    一行3个数,分别表示A B C

    输出

    输出第一次出现重复项的位置,如果答案超过2000000 输出-1

    样例输入

    2 2 9
    

    样例输出

    4

    提示

    30%的数据A B C≤1e5
    100%的数据 A B C≤1e9


    【题解】:

    本来想使用hash表来存储的,后来发现卡我时间,太卡了,所以换了一种,桶标记。分别记录在两个位置

    这个方法也是参考别人的代码的。还有注意Mod的数尽可能接近数组大小。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4  
     5 const int N = 5e6+10;
     6 const int Mod1 = 2200000;
     7 const int Mod2 = 2181271;
     8 const int p1 = 131 ;
     9 const int p2 = 13331 ;
    10  
    11 int vis[N][2];
    12 ll A,B,C;
    13  
    14 int cnt = 0 , Next[N+5],Head[Mod2+10],W[N];
    15  
    16 int main()
    17 {
    18     ios_base :: sync_with_stdio(NULL);
    19     cin.tie(0),cout.tie(0);
    20     //scanf("%lld%lld%lld",&A,&B,&C);
    21     cin >> A >> B >> C  ;
    22  
    23     vis[1][0] = vis[1][1] = 1 ;
    24     ll p1 = 1 , p2 = 1 ;
    25     for(int i=1;i<=2000000;i++){
    26         p1 = ( p1 * A + p1 % B ) %C ;
    27         p2 = ( p2 * A + p2 % B ) %C ;
    28  
    29         if( vis[p1%Mod1][0] && (vis[p1%Mod1][0] == vis[p2%Mod2][1]) ){
    30             cout << i << endl ;
    31             return 0;
    32         }
    33         if( !vis[p1%Mod1][0] ) vis[p1%Mod1][0] = i ;
    34         if( !vis[p2%Mod2][1] ) vis[p2%Mod2][1] = i ;
    35     }
    36     cout << -1 << endl;
    37     return 0;
    38 }
    View Code
  • 相关阅读:
    Requested additional data downloads after package installation, but the data could not be downloaded or could not be processed.(Linux Wine)
    ROS中message的相关知识点
    Vim批量注释
    ORACLE用SYS登录报ORA28009:connection as SYS should be as SYSDBA OR SYSOPER解决方法【转】
    Degrees of Freedom
    dos 下运行php
    php连接sql2000
    记事本编辑C#
    多表查询应用于Datatable
    vc读取INI文件
  • 原文地址:https://www.cnblogs.com/Osea/p/11333464.html
Copyright © 2011-2022 走看看