5152. Brute-force Algorithm EXTREME

Problem code: BFALG

Please click here to download a PDF version of the contest problems. The problem is problem B in the PDF. But the data limits is slightly modified: 1≤P≤1000000 in the original description, but in this EXTREME version, 1≤P≤1000000000.

=========(EDIT, Francky)===============

Professor Brute is not good at algorithm design. Once he was asked to solve a path finding problem. He worked on it for several days and finally came up with the following algorithm:

Function Find(integer n,function func)
If n=1
For i = 1 to a do func()
Elseif n=2
For i = 1 to b do func()
Else Find(n-1,Find(n-2,func))
Function Main
Find(n,funny)

Any fool but Brute knows that the function “funny” will be called too many times. Brute wants to investigate the number of times the function will be called, but he is too lazy to do it.
Now your task is to calculate how many times the function “funny” will be called, for the given a, b and n. Because the answer may be too large, you should output the answer module by P.

Input

There are multiple test cases. The first line of the input contains an integer T, meaning the number of the test cases.
For each test cases, there are four integers a, b, P and n in a single line. You can assume that 1≤n≤1000000000, 1≤P≤1000000, 0≤a, b<1000000.

Output

For each test case, output the answer with case number in a single line.

Example

Input:
3
3 4 10 3
4 5 13 5
3 2 19 100 Output:
Case #1: 2
Case #2: 11
Case #3: 12 公式稍微列一下就可以发现是
次数 a,b
1: 1,0
2: 0,1
3: 1,1
4: 1,2
5: 2,3....
可以看出结果与斐波那契数列有关,
是a^f(n-3)*b^f(n-2),
但是斐波那契数列是用指数形式增长的,很快就会超出64位,而且直接运算肯定会超时,
那么
1.为了解决时间问题,使用矩阵快速幂,
{f(n-1),fn, {0,1, {fn,fn+f(n-1),
0, 0, }* 1,1, }= 0, 0}
2.为了解决斐波那契数字过大问题,有公式
a^c%P=a^(c%phi(P)+phi(P))%P
其中phi是欧拉函数 耽误时间主要原因
1 一开始想要把1-1e6所有欧拉函数值都求出来
2
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
int a,b,P,n;
ll s[2][2],t[2][2];
ll phi;
void calphisub(){
int tP=P;
phi =P;
if((tP&1)==0){
phi>>=1;
while((tP&1)==0){
tP>>=1;
}
}
for(int i=3;i*i<=tP;i+=2)
{
if(tP%i==0)
{
phi=phi/i*(i-1);
while(tP%i==0)
{
tP/=i;
}
}
}
if(tP>1)phi=phi/tP*(tP-1);
}
void multi(ll a[2][2],ll b[2][2] ,ll c[2][2] ){
ll tmp[2][2];
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
tmp[i][j]=0;
for(int k=0;k<2;k++){
tmp[i][j]+=a[i][k]*b[k][j];
if(tmp[i][j]>phi){
tmp[i][j]=tmp[i][j]%phi+phi;
}
}
}
}
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
c[i][j]=tmp[i][j];
}
}
}
void init(){
s[0][0]=1,s[0][1]=1,s[1][0]=0,s[1][1]=0;
t[0][0]=0,t[0][1]=1,t[1][0]=1,t[1][1]=1;
}
void qpow(int n){
while(n>0){
if(n%2==1){
multi(s,t,s);
}
multi(t,t,t);
n/=2;
}
}
ll qpow2(int n,ll sub){
ll ans=1;
while(n>0){
if((n&1)!=0){
ans=ans*sub%P;
}
sub=sub*sub%P;
n/=2;
}
return ans;
}
void getfab(int n,ll& fn,ll& fminus){
if(n==1){
fn=0;fminus=1;
}
else if(n==2){
fn=1;fminus=0;
}
else {
init();
qpow(n-3);
fminus=s[0][0];
fn=s[0][1];
}
}
int main(){
int T;
scanf("%d",&T);
for(int i=0;i<T;i++){
scanf("%d%d%d%d",&a,&b,&P,&n);
if(P==1){ printf("Case #%d: 0\n",i+1);continue;}
ll ta,tb;
calphisub();
getfab(n,tb,ta);
ll pa=qpow2(ta,a)%P;
ll pb=qpow2(tb,b)%P;
ll ans=pa*pb%P;
printf("Case #%d: %I64d\n",i+1,ans);
}
}

  

  

SPOJ 5152 Brute-force Algorithm EXTREME && HDU 3221 Brute-force Algorithm 快速幂,快速求斐波那契数列,欧拉函数,同余 难度:1的更多相关文章

  1. hdu 2044:一只小蜜蜂...(水题,斐波那契数列)

    一只小蜜蜂... Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepte ...

  2. hdu 4549 M斐波那契数列(快速幂 矩阵快速幂 费马小定理)

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4549: 题目是中文的很容易理解吧.可一开始我把题目看错了,这毛病哈哈. 一开始我看错题时,就用了一个快速 ...

  3. HDU 1568 Fibonacci【求斐波那契数的前4位/递推式】

    Fibonacci Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Proble ...

  4. hdu number number number 斐波那契数列 思维

    http://acm.hdu.edu.cn/showproblem.php?pid=6198 F0=0,F1=1的斐波那契数列. 给定K,问最小的不能被k个数组合而成的数是什么. 赛后才突然醒悟,只要 ...

  5. HDU 4639 Hehe(字符串处理,斐波纳契数列,找规律)

    题目 //每次for循环的时候总是会忘记最后一段,真是白痴.... //连续的he的个数 种数 //0 1 //1 1 //2 2 //3 3 //4 5 //5 8 //…… …… //斐波纳契数列 ...

  6. HDU 4549 M斐波那契数列(矩阵快速幂)

    题目链接:M斐波那契数列 题意:$F[0]=a,F[1]=b,F[n]=F[n-1]*F[n-2]$.给定$a,b,n$,求$F[n]$. 题解:暴力打表后发现$ F[n]=a^{fib(n-1)} ...

  7. HDU 1316 (斐波那契数列,大数相加,大数比较大小)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1316 Recall the definition of the Fibonacci numbers: ...

  8. hdu 4549 M斐波那契数列 矩阵快速幂+欧拉定理

    M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Problem ...

  9. 计蒜客 28319.Interesting Integers-类似斐波那契数列-递推思维题 (Benelux Algorithm Programming Contest 2014 Final ACM-ICPC Asia Training League 暑假第一阶段第二场 I)

    I. Interesting Integers 传送门 应该是叫思维题吧,反正敲一下脑壳才知道自己哪里写错了.要敢于暴力. 这个题的题意就是给你一个数,让你逆推出递推的最开始的两个数(假设一开始的两个 ...

随机推荐

  1. 微服务—分布式服务追踪sleuth和zipkin

    随着业务的发展,系统规模也会越来越大,各微服务间的调用关系也越来越错综复杂. 通常一个客户端发起的请求在后端系统中会经过多个不同的微服务调用来协同产生最后的请求结果, 在复杂的微服务架构系统中,几乎每 ...

  2. HCNP学习笔记之HCNP学习的几种境界

    前言: 做任何事情都应该遵循一个循序渐进的过程,而这个过程可能是较为枯乏无味的,在我接触的人中主要分为踏实肯学满腹才华和半途而废不思进取两类.故而希望大家成为前者,勿做后者. 第一境界:散漫无序 简单 ...

  3. Python学习笔记之Python的多重继承和MixIn

    多重继承 继承是面向对象编程的一个重要的方式,因为通过继承,子类就可以扩展父类的功能. 回忆一下Animal类层次的设计,假设我们要实现以下4种动物: Dog - 狗狗: Bat - 蝙蝠: Parr ...

  4. Web服务器对比介绍

    1.Apache Apache是非常强大的老牌Web服务器,具有模块化结构,拥有众多非常成熟稳定的模块,目前仍是使用非常广泛的服务器,但它是基于多进程HTTPServer,需要对每个用户请求创建一个子 ...

  5. oppo R9 WLAN使用代理图解

    以上拼图便是oppo R9 WLAN使用代理图解,代理设为 '手动' ,主机名便是我的电脑的ip地址,端口号是9973: + 9973端口号 (微信web开发者工具不可更改): + 8888 端口号 ...

  6. struts2中各个jar包作用 (转)

    Struts2.3.4 所需的Jar包及介绍 Jar包的分类 jar包名称 jar包版本 jar包 文件名 jar包 的作用 jar包内包含的主要包路径及主要类 依赖的自有jar包名称 依赖的第三方j ...

  7. bat(续七)-for语句(循环结构)

    for语句(循环结构) for语句可以实现类似于C语言里面的循环结构,当然for语句的功能要更强大一点,通过不同的开关可以实现更多的功能.for语句有多个开关,不同开关将会实现不同的功能.   1.无 ...

  8. [BZOJ2282]消防

    Description 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情,所以这个国家 ...

  9. jackson序列化字段字母大小写及字段名重复

    一:Jackson默认的属性发现规则将会查找到如下所述的属性: 1.所有被public修饰的字段(成员变量): 2.所有被public修饰的getter(即形如“getXxx()”的方法): 3.所有 ...

  10. Permission denied: mod_fcgid

    [Tue Jun 16 13:29:08 2015] [warn] (13)Permission denied: mod_fcgid: spawn process /var/www/cgi-bin/g ...