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. HDFS只支持文件append操作, 而依赖HDFS的HBase如何完成数据的增删改查

    转:http://www.th7.cn/db/nosql/201510/135382.shtml 1. HDFS的文件append功能 早期版本的HDFS不支持任何的文件更新操作,一旦一个文件创建.写 ...

  2. Spark高级数据分析· 3推荐引擎

    推荐算法流程 推荐算法 预备 wget http://www.iro.umontreal.ca/~lisa/datasets/profiledata_06-May-2005.tar.gz cd /Us ...

  3. 20145314郑凯杰《信息安全系统设计基础》第八周复习总结 Part A

    20145314郑凯杰<信息安全系统设计基础>第八周复习总结 Part A 学习知识点内容总结 复习线索:http://group.cnblogs.com/topic/73069.html ...

  4. 《JAVA程序设计》第五次实验报告

    20145333 实验五 Java网络编程及安全 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.05.06 18:30-21:3 ...

  5. c语言数据类型字节长度

    突然间就想到了long和int到底什么区别(发现有很多问题都是突然间想到的),然后百度.google各种查找,各种书籍:<C++ Primer>.<C程序设计语言>查看,终于明 ...

  6. Socket 是嘛玩意儿(简单聊聊)

    网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP的封装 ...

  7. 机器学习之线性回归(纯python实现)][转]

    本文转载自:https://juejin.im/post/5a924df16fb9a0634514d6e1 机器学习之线性回归(纯python实现) 线性回归是机器学习中最基本的一个算法,大部分算法都 ...

  8. Ansible Playbooks入门介绍

    1.目录结构 2.详细目录 3.主任务文件main.yaml 主任务文件main.yaml - name: print server name and user to remote testbox # ...

  9. Redis之基本数据类型

    Redis 基本数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). redis类型 含义 S ...

  10. Pandas 的使用

    1. 访问df结构中某条记录使用loc或者iloc属性.loc是按照index或者columns的具体值,iloc是按照其序值.访问类似于ndarray的访问,用序列分别表示一维和二维的位置. 例如: ...