2018 Arab Collegiate Programming Contest (ACPC 2018) H - Hawawshi Decryption 数学 + BSGS

H - Hawawshi Decryption

对于一个给定的生成数列

R[ 0 ] 已知, (R[ i - 1 ] * a + b) % p = R[ i ] (p 是 质数), 求最小的 x 使得 R[ x ] = t

我们假设存在这样一个数列 S[ i ] = R[ i ] - v, 并且S[ i - 1] * a = S[ i ], 那么将S[ i ] = R[ i ] - v带入可得

v = b / (1-a) 那么我们能得到 R[ i ] = (R[ 0 ] - v) * a ^ n + v, 然后就是解一个高次剩余方程,

注意 a == 1 和 R[ 0 ] == v的情况需要特殊考虑。

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PLL pair<LL, LL>
#define PLI pair<LL, int>
#define PII pair<int, int>
#define SZ(x) ((int)x.size())
#define ull unsigned long long

using namespace std;

const int N = 1e4 + 7;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-8;
const double PI = acos(-1);

int n, x, L, R, a, b, p, T, y;

struct hashTable {
    int head[N+5], tot;
    struct node {
        int val, id, nx;
    } a[N+5];
    void init() {
        memset(head, -1, sizeof(head));
        tot = 0;
    }
    void Insert(int val, int id) {
        int p = val % N;
        a[tot].val = val;
        a[tot].id = id;
        a[tot].nx = head[p];
        head[p] = tot++;
    }
    int Find(int val) {
        int p = val % N;
        for(int i = head[p]; ~i; i = a[i].nx)
            if(a[i].val == val) return a[i].id;
        return -1;
    }
} mp;

int fastPow(int a, int b) {
    int ans = 1;
    while(b) {
        if(b & 1) ans = 1ll*ans*a%p;
        a = 1ll*a*a%p; b >>= 1;
    }
    return ans;
}

int BSGS(int a,int b,int p) {
    if(b == 1) return 0;
    if(a == b) return 1;
    if(!b) return !a ? 1 : -1;
    mp.init();
    int m = ceil(sqrt(p)), x = 1, y, z;
    for(int i = 1; i <= m; i++) {
        x = 1ll * x * a % p;
        if(mp.Find(x) == -1) mp.Insert(x, i);
    }
    x = 1, y = fastPow(a, p-m-1);
    for(int i = 0; i < m; ++i) {
        z = mp.Find(1ll*x*b%p);
        if(~z) return i * m + z;
        x = 1ll * x * y % p;
    }
    return -1;
}

int main() {
//    freopen("hawawshi.in", "r", stdin);
    scanf("%d", &T);
    while(T--) {
        scanf("%d%d%d%d%d%d%d", &n, &x, &L, &R, &a, &b, &p);
        int q = 0, r = R-L+1;
        if(a == 1) {
            for(int R0 = L; R0 <= R; R0++) {
                int pos = 1ll*(x-R0+p)%p*fastPow(b, p-2)%p;
                if(pos < n) q++;
            }
        } else {
            int v = 1ll * b * fastPow(1-a+p, p-2) % p;
            for(int R0 = L; R0 <= R; R0++) {
                if(R0 == v) {
                    if(R0 == x) q++;
                } else {
                    int pos = BSGS(a, 1ll*(x-v+p)%p*fastPow((R0-v+p)%p, p-2)%p, p);
                    if(~pos && pos < n) q++;
                }
            }
        }
        int gcd = __gcd(q, r);
        printf("%d/%d\n", q/gcd, r/gcd);
    }
    return 0;
}

/*
*/

 

转载于:https://www.cnblogs.com/CJLHY/p/10263739.html

2022CUST程序设计天梯赛校赛L1题解 L1-1 共抗疫情,长理加油! 签到题,直接输出即可。(代码就不想了,绝对不是因为博主懒) L1-2 stone (5 分) 有 n(n为奇数) 个石子,摆成一排,Alice 和 Bob 轮流取石子,每次每个人不能取与上个人取的石子相邻的石子,不能取的人输。假设 Alice 和 Bob 都绝顶聪明,Alice 先手取。 问是 Alice 赢还是 Bob 赢。 基础博弈,n为奇数,先手必赢。输出先手的即可。 L1-3 志愿者Lucky (10 分) 羊驼学院突发疫情,寝室各自封寝,寝室楼长度为l 阅读详情

相关推荐

ACPC2013】马里奥赛车(01背包)

这里终究是个技术社区,老是在这里写中二少年的风花雪月也不大好,来写一篇题解。 这题目混进了软件工程大一新生的java基础题目里,与其他设计类、熟悉语法的题目格格不入不讲武德。我一查来源,好家伙是中东+非洲的大学生程序竞赛,老师找到这题目也是不容易,而且各大OJ上也没有。 题目大意 路上有n个车站,你有m个硬币,每个硬币都有自己的能量和使用成本,每组数据有成本限制l。 从a车站跳跃到b车站的方法是:使用一些硬币的组合,使这些硬币的能量恰好等于两车站距离(坐标之差之绝对值)。 对于一次跳跃,每硬币只能用一次且

BalingHaku 1315

2018 Arab Collegiate Programming Contest (ACPC 2018) L.Looking for Taste(按位或)

题目 n个数选k个,使它们的或最大 n&lt;=1e5 k&gt;=20 ai&lt;=1e6 题解 从高向低位或, 每个数至少产生一位的贡献,所以最多20个数 贪心地使或的数最大即可 由于或没有副作用可以优先或大的数 k个最大一定可以由k-1个最大的转移而来 k&lt;=20也可以做,复杂度O(min(k,最大的数的位数)*n) 心得 QAQ第一次打Arab的场体验极差……...

小衣同学的博客 1010

ACM-ICPC竞赛指南与题解

ACM-ICPC代码库 ACM-ICPC代码库是一个在线的资源集合,专门为参加 ACM 国际大学生程序设计竞赛(ACM International Collegiate Programming Contest,简称 ACPC)的学生提供帮助和支持。 什么是ACM-ICPC? ACM 国际大学生程序设计竞赛是由国际计算机科学协会(ACM)主办的一项全球性的大学生编程竞赛。该竞赛旨在培养学生的团队合作...

gitblog_00066的博客 948

2018 Arab Collegiate Programming Contest (ACPC 2018) G. Greatest Chicken Dish (线段树+GCD)

题目链接:https://codeforces.com/gym/101991/problem/G 题意:给出 n 个数,q 次询问区间[ li,ri ]之间有多少个 GCD = di 的连续子区间。 题解:类似HDU 5726,可以先看一下这个blog:https://blog.csdn.net/u013569304/article/details/51987053 考虑离线,先预处理出[ ...

weixin_30312557的博客 247

【gym 101991 E】(ACPC 2018) E. Exciting Menus 题解

文章目录题意题解代码 题意 给 NNN 个字符串,第 iii 个字符串的第 kkk 个位置(从 111 开始)都有权值 AkiA_k^iAki​。 定义 Q(i,j,k)=popularity(Sj,ki)×Aki×∣Sj,ki∣Q(i, j, k)=popularity(S_{j,k}^{i}) \times A_k^i \times |S_{j,k}^i|Q(i,j,k)=popularity(Sj,ki​)×Aki​×∣Sj,ki​∣ popularity(str)popularity(str)p

lzh_naive的博客 380

Arab Collegiate Programming Contest 2015 E. The Minions Quiz(思维)

The minions have finally found their new master. This time, he is a Math professor and he is trying veryhard to teach them math. He has been teaching them bitwise operators for over a year! They learn...

244

Arab Collegiate Programming Contest 2012 解题报告(约等于AK)

比赛地址 大神都是各种ak,小菜只能赛后默默补题。。。。。。。 H题看不懂啊,,,,,,路过的帮忙一下 100多个人A的题就不说了。。。。 B题:  可以用平衡树来做,因为最多就200000个字符,所以每次可以暴力插入splay树,输出的时候也一样暴力: #include #include #define L ch[x][0] #define R ch[x][1] #def

努力奋斗才能梦想成真 1990

ACPC Headquarters : AASTMT (Stairway to Heaven)

连接:传送门 As most of you know, the Arab Academy for Science and Technology and Maritime Transport in Alexandria, Egypt, hosts the ACPC Headquarters in the Regional Informatics Center (RIC), and it h

jade的博客 813

Arab Collegiate Programming Contest 2015 计蒜客重现解()题报告

B - The Lion King(暴力) 题目链接 In the Pride Lands of Africa, a lion rules over the animals as king. The birth of King Mufasa and QueenSarabi’s son Simba creates envy and resentment in Mufasa’s younger bro...

Happig的博客 529

Arab Collegiate Programming Contest 2015 D. Fractionstellar

Arab Collegiate Programming Contest 2015 D.Problem D. Fractionstellar It’s 2050. Humans have already colonized Mars and other planets long time ago and there are already some programs for travelling t...

旺崽的博客 2590

2022年,ICPC比赛、CCPC比赛、CCF-CSP考试、蓝桥杯比赛、天梯赛日程

**ICPC比赛日程(第47届,2022年):** 第一次网络选拔赛 2022年9月18日 第二次网络选拔赛 2022年9月25日 沈阳站 2022年11月5-6日 东北大学 西安站 2022年11月12-13日 西北工业大学

海岛Blog 5万+

Arab Collegiate Programming Contest 2015 - K Road Network(树的直径)

题目链接 After a fierce battle with his opponent, Bruce Wayne finally won the elections and became the mayorof Gotham. Like every other politician, he had an agenda with lots of projects for the sake of G...

Happig的博客 345

Arab Collegiate Programming Contest 2015

比赛链接 D题 解题思路: 这题把自己敲迷了,没理解好。 给予 4 个数, 求 a[0] / a[1] 和 a[2] / a[3] 的gcd 和 lcm。 首先我们会将他们两两互素,然后当他们的gcd 为 x / y 时, 满足式子: a[0] % x == 0, a[2] % x == 0; y % a[1] == 0, y % a[3] == 0; 因此我们可以推出: x 为 a...

LiangNiuMu的博客 322

2018 Arab Collegiate Programming Contest (ACPC 2018) E - Exciting Menus AC自动机

E - Exciting Menus 建个AC自动机求个fail指针就好啦。 #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define PLL pair<LL, LL> #define ...

267

German Collegiate Programming Contest 2015题解(计蒜课第三场)

比赛网站: http://codeforces.com/gym/100753/problem/C 这场比赛的时候没打,赛后虚拟比赛的时候卡了两个题,比赛完了结果都A了。。很烦。。 [C - Cake] 比赛的时候以为是个水题,随手写了个2分结果意识到精度有问题。。最终还是没过。 其实它的面积和1/s21/s21/s^2 成正比,学过相似都知道。所以我们只要算出s=2的时候的面积,然后根据...

qq_34921856的博客 436

The 2013 Arab Collegiate Programming Contest 题解

代码其实都没贴可以理解为是脑补的...........

西部314的砖栏 765

ICPC Arab Collegiate Programming Contest 2014

给N个密码,密码 A 和密码 B 如果长度相同,而且对于每个位置 i ,都有 | A[i] - B[i] |相同,那么则称密码 A 和密码 B 是等价的。 输入密码时会跳过和之前输入过密码相等价的密码。求最多要按顺序输入多少个密码。 解题思路: 模拟即可(确信)。 其实上只需高效判断当前密码是否有相等价的被输入了即可。换个角度考虑,输入了一个新密码的之后,我们会跳过所有与它等价的密码。所以,我们不妨同时也“输入”所有与它等价的密码,然后在之后即容易判断当前密码是否有与它等价的密码被输入过了。 如何枚举所有与

苦鬼·。 429

ACM International Collegiate Programming Contest (2018)A~F

ACM International Collegiate Programming Contest (2018)A~F 文章目录ACM International Collegiate Programming Contest (2018)A~FA. Careful ThiefB. Friends and CookiesC. Flip the BitsD. Magic SticksE.N-Dimens...

backordinary的博客 638
上一篇: AIM Tech Round 4 (Div. 1) C - Upgrading Tree 构造 + 树的重心
下一篇: Codeforces Round #254 (Div. 1) D - DZY Loves Strings
afd5154
博客等级 码龄12年 4粉丝 186原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值