本文出自:http://blog.csdn.net/svitter

题意:

f(x) = K, x = 1

f(x) = (a*f(x-1) + b)%m , x > 1

求出( A^(f(1)) + A^(f(2)) + A^(f(3)) + ...... + A^(f(n)) ) modular P.

1 <= n <= 10^6

0 <= A, K, a, b <= 10^9

1 <= m, P <= 10^9

本题目的关键在于大幂的分解和。。你要这样想,因为不停的求A的幂,所以肯定把算过的保存下来最合适。

打表。(- -)每次都是打表,shit。

把f分解为 fix * k + j 的形式,f就是f(x)的简称。(哈希)

然后关键是fix怎么整,多少合适。我觉得33333合适。为啥?

因为10^9 / 33333 =30000数组不大。然后余数也在33333之内,其好,那就它吧。

然后就用普通的幂模相乘打表就可以f[i] = (f[i-1] * a)mod p,这是个简单的例子,a和p没有实际含义。

这个题目我在做的时候蛋疼到二分法动态打表,但是超空间,因为不停的递归调用造成了超空间。。但是我觉得如果能够实现。。用栈的方法,应该会更加节省时间。因为用到的才计算。如果有不同的意见,请回复我,谢谢。

AC代码:

//============================================================================
// Name : math.cpp
// Author : Vit
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================ #include <iostream>
#include <stdio.h>
#include <string.h>
#include <cmath> using namespace std;
#define lln long long int
#define fix 33333 //num
lln n, A, K, a, b, m, P; //A^f f = fix * k + j
// f = dp1 * k + dp2 lln dpk[30001];
lln dpj[33334]; void init()
{
int i, j; //init hash
dpj[1] = A;
dpj[0] = dpk[0] = 1; for(i = 2; i <= 33333; i++)
dpj[i] = (dpj[i-1] * A) % P; dpk[1] = dpj[33333];
for(j = 1; j <= 30000; j ++)
dpk[j] = (dpk[j-1] * dpk[1]) % P;
} void ace()
{
//work pit;
int i, t, c;
lln ans, f;
scanf("%d", &t);
for(c = 1; c <= t; c++)
{
scanf("%lld%lld%lld%lld%lld%lld%lld",&n, &A, &K, &a, &b, &m, &P);
//init
init();
f = K;
ans = 0;
for(i = 0; i < n; i++)
{
ans = (ans + dpk[f/fix] * dpj[f % fix]) % P;
f = (a * f + b) % m;
}
printf("Case #%d: %lld\n", c, ans);
}
} int main()
{
ace();
return 0;
}
作者:svitter 发表于2014-5-5 21:26:29 原文链接
阅读:161 评论:0 查看评论

[原]sdut2605 A^X mod P 山东省第四届ACM省赛(打表,快速幂模思想,哈希)的更多相关文章

  1. [原]sdut2624 Contest Print Server (大水+大坑)山东省第四届ACM省赛

    本文出自:http://blog.csdn.net/svitter 原题:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&am ...

  2. 山东省第四届ACM省赛

    排名:http://acm.sdut.edu.cn/sd2012/2013.htm 解题报告:http://www.tuicool.com/articles/FnEZJb A.Rescue The P ...

  3. 2013年山东省第四届ACM大学生程序设计竞赛-最后一道大水题:Contest Print Server

    点击打开链接 2226: Contest Print Server Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 53  Solved: 18 [Su ...

  4. 山东省第四届ACM大学生程序设计竞赛解题报告(部分)

    2013年"浪潮杯"山东省第四届ACM大学生程序设计竞赛排名:http://acm.upc.edu.cn/ranklist/ 一.第J题坑爹大水题,模拟一下就行了 J:Contes ...

  5. sdut Mountain Subsequences 2013年山东省第四届ACM大学生程序设计竞赛

    Mountain Subsequences 题目描述 Coco is a beautiful ACMer girl living in a very beautiful mountain. There ...

  6. Alice and Bob(2013年山东省第四届ACM大学生程序设计竞赛)

    Alice and Bob Time Limit: 1000ms   Memory limit: 65536K 题目描述 Alice and Bob like playing games very m ...

  7. 山东省第四届acm解题报告(部分)

    Rescue The PrincessCrawling in process... Crawling failed   Description Several days ago, a beast ca ...

  8. 山东省第四届ACM程序设计竞赛部分题解

    A : Rescue The Princess 题意: 给你平面上的两个点A,B,求点C使得A,B,C逆时针成等边三角形. 思路: http://www.cnblogs.com/E-star/arch ...

  9. Sdut 2409 The Best Seat in ACM Contest(山东省第三届ACM省赛 H 题)(模拟)

    题目描述 Cainiao is a university student who loves ACM contest very much. It is a festival for him once ...

随机推荐

  1. java中使用正则表达式

    1.用正则表达式分割字符串 Pattern SPLIT2 = Pattern.compile("[,]"); String[] tmpStrings1 = SPLIT2.split ...

  2. 离线安装PM2

    因为要部署应用的机器没有公网连接,所以直接npm install pm2是不可能了, 简单记录一下怎么离线安装pm2 首先,找一台可以在线安装pm2的机器 执行 npm install pm2 -g ...

  3. java代码中后台向前台传递list或map集合案例

    导入jar包 新建一个servert传递map集合 ajax.java代码: package servlet; import java.io.IOException; import java.io.P ...

  4. django 获取系统当前时间 和linux 系统当前时间不一致 问题处理。

    问题场景: 在django admin models 实体对象添加一个属性最后修改时间,用户在添加.修改是系统自动修改操作时间. UpdateTime自动获取系统时间.并且自动修改. 代码设置如下. ...

  5. aix下oracle数据库创建表空间和用户

    #mklv -y lvname -T O -w n -s n -r n datavg 500 在两个节点分别修改如下权限: #chown -R oracle:oinstall /dev/rlvname ...

  6. How do I implement a cancelable event?

    n System.ComponentModel, there's a class called CancelEventArgs which contains a Cancel member that ...

  7. windows查看端口占用

    查看占用端口的进程ID netstat -aon | findstr "9000" 再用进程ID查看进程 tasklist | findstr "6048"

  8. CodeForces 604C 【思维水题】`

    题意: 给你01字符串的长度再给你一个串. 然后你可以在这个串中选择一个起点和一个终点使得这个连续区间内所有的位取反. 求: 经过处理后最多会得到多少次01变换. 例如:0101是4次,0001是2次 ...

  9. gitlab和Django实现push自动更新

    1.设置webhook gitlab->setting->webhook:http://121.143.191.166:7000?token=23028-b396-12e5-9912-ba ...

  10. jsp页面List迭代

    1.行迭代 <tbody>   <c:choose>    <c:when test="${not empty result}">     &l ...