bzoj3122 [Sdoi2013]隨機數生成器(bsgs+擴歐+數列)

Description
這里寫圖片描述

Input

輸入含有多組數據,第一行一個正整數T,表示這個測試點內的數據組數。

接下來T行,每行有五個整數p,a,b,X1,t,表示一組數據。保證X1和t都是合法的頁碼。

注意:P一定為質數

Output

共T行,每行一個整數表示他最早讀到第t頁是哪一天。如果他永遠不會讀到第t頁,輸出-1。

Sample Input
3
7 1 1 3 3
7 2 2 2 0
7 2 2 2 1

Sample Output
1
3
-1

HINT
0<=a<=P-1,0<=b<=P-1,2<=P<=10^9

分析:
剛剛學了數列,看到這道題就不那么難受了

X[i+1]=(aX[i]+b)mod p
X[i+1]+u=a(X[i]+u)
(a-1)u=b
u=b/(a-1)
X[i+1]+u=(X[1]+u)*a^i
a^i=(X[i+1]+u)/(X[1]+u) (mod p)
已知X[i+1]
實際上就是
x^i=z (mod p),求解最小i

最后答案就是i+1

然而這只適用于a!=1的情況

當a==1的時候
這就是一個等差數列了
X[i+1]=X[1]+b*i
X[i+1]-X[1]=b*i
設x=i,z=X[i+1]-X[1]
式子就可以化簡成
b*i=z (mod p)
b*i+k*p=z
我們先用擴歐求解b*i+k*p=1
最后把答案*z+1就可以了

注意

如果z不是gcd(b,p)的倍數,那么無解

一開始我的算法是:
i=(X[i+1]-X[1])*inv(b)
但是這樣秒WA,我覺得一概是無法判斷無解導致的

注意:p一定為質數
這樣求逆元就可以用費馬小定理了

tip

注意特殊情況的特判
x1==t,ans=1
a==0&&b==t,ans=2
a==0&&b!=t,ans=-1

一直連WA,最后才發現是主程序的問題
一個輸出后忘了回車!!!

這里寫代碼片
#include<cstdio>
#include<iostream>
#include<cstring>
#include<map>
#include<cmath>
#define ll long longusing namespace std;map<ll,int> mp;
ll p,z,t,x1,a,b,x,y;ll gcd(ll a,ll b)
{ll r=a%b;while (r){a=b;b=r;r=a%b;}return b;
}ll KSM(ll a,ll b,ll p)
{a%=p;ll t=1;while (b){if (b&1)t=(t%p*a%p)%p;b>>=1;a=(a%p*a%p)%p;}return t%p;
}int bsgs(ll x,ll z,ll p)
{mp.clear();x%=p; z%=p;if (x==0&&z==0) return 2;if (x==0) return -1;ll m=(ll)ceil(sqrt((double)p)),now=1;mp[1]=m+1;for (int i=1;i<m;i++){now=(now%p*x%p)%p;if (!mp[now]) mp[now]=i;}ll inv=1,tmp=KSM(x,p-m-1,p);for (int k=0;k<m;k++){int i=mp[(z%p*inv%p)%p];if (i){if (i==m+1) i=0;return k*m+i+1;}inv=(inv%p*tmp%p)%p;}return -1;
}void exgcd(ll a,ll b)
{if (b==0){x=1; y=0;return;}else{exgcd(b,a%b);int tt=y;y=x-(a/b)*y;x=tt;}
}ll inv(ll a,ll p)
{return KSM(a,p-2,p);
}int main()
{int T;scanf("%d",&T);while (T--){scanf("%lld%lld%lld%lld%lld",&p,&a,&b,&x1,&t);if (x1==t){printf("1\n");continue;} else if (a==0){if (b==t) printf("2\n");else printf("-1\n");continue;}else if (a==1)   //等差數列 {z=((t-x1)%p+p)%p;if (z%gcd(b,p)!=0){printf("-1\n");continue;}exgcd(b,p);x=(x%p*z%p)%p;printf("%lld\n",(x%p+p)%p+1);}else   //等比 {ll u=(b%p*inv(a-1,p)%p)%p;   //u=b/(a-1)t=(t%p+u%p)%p;  x1=(x1%p+u%p)%p;z=(t%p*inv(x1,p)%p)%p;   //(X[i+1]+u)/(X[1]+u)printf("%d\n",bsgs(a,z,p));}}return 0;
}

轉載于:https://www.cnblogs.com/wutongtong3117/p/7673239.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282406.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282406.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282406.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

邊寫 Javascript 代碼邊玩游戲 – WarriorJS

在 github 上看到這個有趣的項目 – WarriorJS &#xff0c;項目的內容寫著 – 令人興奮的程序設計和人工智慧游戲&#xff0c;Ok 我坦白我是看到人工智慧被這個專案所吸引&#xff0c;但是玩了兩個關卡&#xff0c;還是不知道這個游戲跟人工智慧有什么關系&#xff0c;不過這個…

挑選合適自己的一門編程語言

2019獨角獸企業重金招聘Python工程師標準>>> 導讀想學編程的原因有很多&#xff0c;你也許是想要做一個程序&#xff0c;又或者你只是想投身于這個行業&#xff0c;所以&#xff0c;在選擇你的第一門編程語言之前&#xff0c;問問你自己&#xff1a;你想要在哪里運行…

css 實現章節名稱不換行,多余部分用 ... 代替

修改之前:修改之后: 代碼: <p style "white-space: nowrap;text-overflow: ellipsis;overflow: hidden;"><? $d[name] ?></p> <i><? $d[pen_name] ?></i> <i><?phpforeach ($d[tags] as $t) {echo $t[tag_name];…

.NET 反向代理-YARP 部署Https(SSL)

相關文章&#xff1a;.NET 反向代理-YARP.NET 反向代理-YARP 根據域名轉發分享一個基于Abp 和Yarp 開發的API網關項目使用 Yarp 做網關YARP&#xff08;Yet Another Reverse Proxy&#xff09;是使用 .NET 構建的高度可定制的反向代理C# 開源一個基于 yarp 的 API 網關 Demo&am…

shell腳本--cut命令

bash&shell系列文章&#xff1a;http://www.cnblogs.com/f-ck-need-u/p/7048359.html 1.1 選項說明 cut命令將行按指定的分隔符分割成多列&#xff0c;它的弱點在于不好處理多個分隔符重復的情況&#xff0c;因此經常結合tr的壓縮功能。 -b&#xff1a;按字節篩選&#xff…

12C RAC for ASM添加磁盤步驟

RHEL 7.2使用EMC Powerpath擴容2T磁盤空間&#xff0c;需要添加至以用12C RAC for ASM系統中。下面是具體步驟&#xff0c;主機人員告知擴容別名為data_center_16、data_center_17 1&#xff1a;linux 7 系統下添加映射存儲LUN(無需重啟)1>查看機器HBA卡信息--兩個節點機器都…

Windows 下 Redis 的下載和安裝

一 安裝redis 1. 下載redis https://github.com/MicrosoftArchive/redis/releases 注: 如果上面網址下載不了, 就到這里下載 https://download.csdn.net/download/m_nanle_xiaobudiu/104370342. 解壓壓縮文件夾3. 運行redis服務端到此 , redis已經可以正常使用了,但是為了方便…

什么是行內塊元素?

2019獨角獸企業重金招聘Python工程師標準>>> 我們都知道行內元素和塊級元素&#xff0c;在實際開發中&#xff0c;經常會聽到行內塊元素&#xff0c;那么什么是行內塊元素呢&#xff1f; 行內塊元素實際就是把塊元素以行的形式展現,保留了塊元素可以設置的對應CSS屬…

WPF-08 控件模板

模板是描述控件外觀&#xff0c;WPF中每個控件都有一個默認的模板&#xff0c;你可以通過定義模板來重寫控件可視化外觀和行為&#xff0c;WPF中有兩種常用的模板Control Template和Data TemplateControl Template控件模板定義了控件的可視化外觀&#xff0c;所有的UI控件都有自…

玄學搜索\隨稽化

正解又不會寫&#xff0c;又懶得去想 只好每次考試大大暴力&#xff0c;維持一下生活了 ----------------------- P1337 [JSOI2004]平衡點 / 吊打XXX 題目描述 有n個重物&#xff0c;每個重物系在一條足夠長的繩子上。每條繩子自上而下穿過桌面上的洞&#xff0c;然后系在一起。…

第0次作業

問題1:你為什么選擇計算機專業&#xff1f;你認為你的條件如何&#xff1f; 答:我平時比較喜歡研究一些自己認為神秘的東西&#xff0c;我認為計算機就是這樣的神秘東西&#xff01;所以我選擇這個專業&#xff01;我認為我自己可以學會計算機這個專業&#xff01;我對自己有信…

Nginx +Tomcat 實現動靜態分離(轉)

Nginx Tomcat 實現動靜態分離 動靜態分離就是Nginx處理客戶端的請求的靜態頁面(html頁面)或者圖片&#xff0c;Tomcat處理客戶端請求的動態頁面&#xff08;jsp頁面&#xff09;&#xff0c;因為Nginx處理的靜態頁面的效率高于Tomcat。 一&#xff0e;Nginx簡介&#xff1a; Ng…

Beanstalked的初步了解和使用(包括利用beanstalkd 秒殺消息隊列的實現)

一 Beanstalkd 是什么 Beanstalkd&#xff0c;一個高性能、輕量級的分布式內存隊列系統二 Beanstalkd 特性 1. 優先級&#xff08;priority&#xff09; 注&#xff1a;優先級就意味 支持任務插隊&#xff08;數字越小&#xff0c;優先級越高&#xff0c;0的優先級最高&#…

WPF效果第二百篇之再玩Gamma曲線

前面效果中使用比較low的方式實現了2.4的Gamma曲線;雖說后面加了點動畫呈現效果,但也就是個過渡版;今天才基本符合需求的效果:1、還是基于WPF效果第一百七十八篇之貝塞爾曲線他來實現的:3個ListBox 3個LandmarkControl2、在LandmarkControl增加插點位事件View:LandmarkControl …

2018企業面試總匯(答案請自行搜羅) 新增19年阿里面題(反向拓展技術棧)

Java 1.多個線程同時讀寫&#xff0c;讀線程的數量遠遠大于寫線程&#xff0c;你認為應該如何解決并發的問題&#xff1f;你會選擇加什么樣的鎖&#xff1f; 2.JAVA的AQS是否了了解&#xff0c;它是干嘛的&#xff1f; 3.除了synchronized關鍵字之外&#xff0c;你是怎么來保障…

skynet源碼閱讀5--協程調度模型

注&#xff1a;為方便理解&#xff0c;本文貼出的代碼部分經過了縮減或展開&#xff0c;與實際skynet代碼可能會有所出入。 作為一個skynet actor&#xff0c;在啟動腳本被加載的過程中&#xff0c;總是要調用skynet.start和skynet.dispatch的&#xff0c;前者在skynet-os中…

ASP.NET Core GRPC 和 Dubbo 互通

一.前言Dubbo 是比較流行的服務治理框架&#xff0c;國內不少大廠都在使用。以前的 Dubbo 使用的是私有協議&#xff0c;采集用的 hessian 序列化&#xff0c;對于多語言生態來說是極度的不友好。現在 Dubbo 發布了新版本 v3&#xff0c;推出了基于 gRPC 的新協議 Triple&#…

詳解C# 迭代器

[引用&#xff1a;https://www.cnblogs.com/yangecnu/archive/2012/03/17/2402432.html] 迭代器模式是設計模式中行為模式(behavioral pattern)的一個例子&#xff0c;他是一種簡化對象間通訊的模式&#xff0c;也是一種非常容易理解和使用的模式。簡單來說&#xff0c;迭代器模…

利用redis List隊列簡單實現秒殺 PHP代碼實現

一 生產者producer部分 --------------------------------producer 部分注釋------------------------------------------------------------ 用戶在頁面請求之后, 獲取到用戶uid , 跳轉到這個加入隊列的方法 (這里直接在producer中模擬了多個uid) 在方法內部判斷redis隊列長…

使用Filezilla 與 linux遠程服務器傳輸文件時,設置默認打開編輯器

1. 點擊編輯 2. 選擇設置&#xff0c;點擊文本編輯 3. 設置編輯器目錄 4. 確定作用&#xff1a; 這樣設置之后&#xff0c;可以實現在遠程站點欄直接下載并使用phpstorm編輯的作用 正常需要下載之后&#xff0c;再去本地相應下載目錄打開&#xff0c;然后再進行上傳文件&#x…