洛谷P3306 随机数生成器
题意:给你一个数列,a1 = x,ai = (A * ai-1 + B) % P,求第一个是t的是哪一项,或者永远不会有t。
解:循环节不会超过P。我们使用BSGS的思想,预处理从t开始跳√P步的,插入Hash表内。
然后每次把a1跳√P步,来看是否在Hash表中存在。
这样发现我们有40,WA了60分。为什么呢?考虑是否存在两个数x和y,它们跳一次之后一样了。发现这种情况只会出现在A = 0的时候,于是特判掉A = 0。可获得100分。
- #include <bits/stdc++.h>
- const int N = ;
- int MO, A, B, op, aim;
- inline int qpow(int a, int b) {
- int ans = ;
- while(b) {
- if(b & ) {
- ans = 1ll * ans * a % MO;
- }
- a = 1ll * a * a % MO;
- b = b >> ;
- }
- return ans;
- }
- namespace Hash {
- struct Node {
- int nex, v, id;
- }node[N]; int tp;
- const int mod = ;
- int e[mod];
- inline void clear() {
- tp = ;
- memset(e, , sizeof(e));
- return;
- }
- inline void insert(int v, int id) {
- int x = v % mod;
- for(int i = e[x]; i; i = node[i].nex) {
- if(node[i].v == v) {
- node[i].id = id;
- return;
- }
- }
- node[++tp].nex = e[x];
- node[tp].v = v;
- node[tp].id = id;
- e[x] = tp;
- return;
- }
- inline int find(int v) {
- int x = v % mod;
- for(int i = e[x]; i; i = node[i].nex) {
- if(node[i].v == v) {
- return node[i].id;
- }
- }
- return -;
- }
- }
- inline void solve() {
- Hash::clear();
- scanf("%d%d%d%d%d", &MO, &A, &B, &op, &aim);
- if(op == aim) {
- printf("%d\n", );
- return;
- }
- if(A == ) {
- if(B == aim) {
- printf("2\n");
- }
- else {
- printf("-1\n");
- }
- return;
- }
- int T = sqrt((double)MO);
- for(int i = ; i < T; i++) {
- Hash::insert(aim, i);
- //printf("Hash insert %d %d \n", aim, i);
- aim = (1ll * A * aim % MO + B) % MO;
- }
- int c = qpow(A, T), d;
- if(A == ) {
- d = 1ll * B * T % MO;
- }
- else {
- d = (1ll * (c - ) * qpow(A - , MO - ) % MO * B % MO + MO) % MO;
- }
- //printf("c = %d d = %d \n", c, d);
- for(int i = ; (i - ) * T < MO; i++) {
- op = (1ll * op * c + d) % MO;
- int t = Hash::find(op);
- //printf("op = %d t = %d \n", op, t);
- if(t != -) {
- printf("%d\n", i * T - t + );
- return;
- }
- }
- printf("-1\n");
- return;
- }
- int main() {
- int T;
- scanf("%d", &T);
- while(T--) {
- solve();
- }
- return ;
- }
AC代码
洛谷P3306 随机数生成器的更多相关文章
- 洛谷P3600 随机数生成器(期望dp 组合数)
题意 题目链接 Sol 一条重要的性质:如果某个区间覆盖了另一个区间,那么该区间是没有用的(不会对最大值做出贡献) 首先不难想到枚举最终的答案\(x\).这时我们需要计算的是最大值恰好为\(x\)的概 ...
- [洛谷P5147]随机数生成器
题目大意:$$f_n=\begin{cases}\frac{\sum\limits_{i=1}^nf_i}n+1&(n>1)\\0&(n=1)\end{cases}$$求$f_n ...
- 洛谷P3600随机数生成器——期望+DP
原题链接 写到一半发现写不下去了... 所以orz xyz32768,您去看这篇题解吧,思路很清晰,我之前写的胡言乱语与之差距不啻天渊 #include <algorithm> #incl ...
- 洛谷 P3600 - 随机数生成器(期望 dp)
题面传送门 我竟然独立搞出了这道黑题!incredible! u1s1 这题是我做题时间跨度最大的题之一-- 首先讲下我四个月前想出来的 \(n^2\log n\) 的做法吧. 记 \(f(a)=\m ...
- 【洛谷 P3306】[SDOI2013]随机数生成器 (BSGS)
题目链接 怎么这么多随机数生成器 题意见原题. 很容易想到\(BSGS\)算法,但是递推式是\(X_{i+1}=(aX_i+b)\mod p\),这显然不是一个等比数列. 但是可以用矩阵乘法来求出第\ ...
- 洛谷P3306 [SDOI2013]随机数生成器(BSGS)
传送门 感觉我BSGS都白学了……数学渣渣好像没有一道数学题能自己想出来…… 要求$X_{i+1}=aX_i+b\ (mod \ \ p)$ 左右同时加上$\frac{b}{a-1}$,把它变成等比数 ...
- 洛谷 [P4035] 球形空间生成器
高斯消元 注意浮点误差,判断一个浮点数是否为 0 的时候,看他的绝对值与 \(10^{-8}\)的关系 #include <iostream> #include <algorithm ...
- 洛咕 P3306 [SDOI2013]随机数生成器
洛咕 P3306 [SDOI2013]随机数生成器 大力推式子??? \(X_{i}=\underbrace{a(a(\cdots(a(a}_{i-1个a}X_1+b)))\cdots)\) \(=b ...
- P3306 [SDOI2013]随机数生成器(bzoj3122)
洛谷 bzoj 特判+多测真恶心 . \(0\le a\le P−1,0\le b\le P−1,2\le P\le 10^9\) Sample Input 3 7 1 1 3 3 7 2 2 2 0 ...
随机推荐
- Spring 基于Aspectj切面表达式(6)
1 package com.proc; 2 3 import org.aspectj.lang.JoinPoint; 4 import org.aspectj.lang.ProceedingJoinP ...
- 全网最全乌云drops文章下载(epub)
前几天搞得epub格式的,为了方便kindle才做的,没想到站关了. 链接: http://pan.baidu.com/s/1eRIoJC2 密码: b6aq
- 记 openSUSE 42.3 升级到Leap 15.0
先将系统的软件更新到最新版本 sudo zypper update 删除42.3的软件源,若有其他数据源,如nginx的,也需要一并删除,可使用zypper lr -d 来查询 sudo zypper ...
- 转载:Linux命令经典面试题:统计文件中出现次数最多的前10个单词
1.使用linux命令或者shell实现:文件words存放英文单词,格式为每行一个英文单词(单词可以重复),统计这个文件中出现次数最多的前10个单词 主要考察对sort.uniq命令的使用,相关解释 ...
- 在python3中的编码
在python3中的编码 #_author:Administrator#date:2019/10/29import sysprint(sys.getdefaultencoding())#utf-8 打 ...
- Sentinel 发布里程碑版本,添加集群流控功能
自去年10月底发布GA版本后,Sentinel在近期发布了另一个里程碑版本v1.4(最新的版本号是v1.4.1),加入了开发者关注的集群流控功能. 集群流控简介 为什么要使用集群流控呢?假设我们希望给 ...
- &卡特兰数学习笔记
一.关于卡特兰数 卡特兰数是一种经典的组合数,经常出现在各种计算中,其前几项为 : 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 20801 ...
- webpack引入jQuery
1. 本地文件引入 配置 const webpack=require('webpack'); module.exports={ resolve:{ alias:{ //绝对路径 jQuery:path ...
- 2019/10/9 CSP-S 模拟测
T1:最大约数和 给定一个正整数 S,现在要求你选出若干个互不相同的正整数,使得它们的和不大于 S,而且每个数的因数(不包括本身)之和最大.S <= 1000 分析: 其实考完才听他们说是背包, ...
- Android基础控件EditText
1.常用属性 <!--selectAllOnFocus 获得焦点后全选组件内所有文本内容--> <!--inputType 限制输入方式--> <!--singleLin ...