Sol

矩阵乘法+快速幂+欧拉定理.

首先观察题目可以发现 \(A_n\) 可以表示成关于 \(K\) 和 \(A_0\) 的几次幂的形式.

\(A_0\) 就比较简单了 \(m^n\) 所以第一部分 \(ans1=A_0^{m^n}\) .

看看 \(k\) 找一下规律就可以发现, \(K\) 的次幂形式是 \(m^{n-1}+2m^{n-2}+3m^{n-3}+...+nm^0\) .

这个东西可以构造一个矩阵,来递推出来.矩阵里需要有 \(3\) 个变量 \(ans,b,1\) .

其中 \(ans\) 是当前答案, \(b\) 是循环变量, \(1\) 就是 \(b\) 每次递增的数值.

\[\begin{bmatrix}ans\\ b\\ 1\end{bmatrix}\]

就是这样的一个矩阵,我们想它变成

\[\begin{bmatrix}ans*m+b\\ b+1\\ 1\end{bmatrix}\]

显然啊.矩阵很好构造.

\[\begin{bmatrix}m&1&0\\0&1&1\\0&0&1\end{bmatrix}\]

这个矩阵快速幂就可以了,但是注意是 \(n-1\) 次幂.

然后这道题还有个坑点就是 \(p\) 不是质数,但是保证互质,如果是 \(k\) 或 \(A_0\) 我们只需要模关于 \(p\) 的逆元的次幂就可以了,这里可以直接用欧拉定理.

\[a^{\varphi(n) }\equiv 1(mod n)\]

然后就成了模板题了...满满的全是模板...

md!sbt卡常数.写个快速乘.变成 \(log^2\) T到死.需要优化这个常数,把一个 \(log\) 优化掉就可以.

快速乘可以分段来写先乘前 \(10^6\) 的数字再乘后 \(10^6\) 的数字就可以了.

之前没想快速乘的这个 \(log\) 感觉可以过...然后为了卡常数...什么都写了...

Code

/**************************************************************
Problem: 3665
User: BeiYu
Language: C++
Result: Accepted
Time:12284 ms
Memory:20836 kb
****************************************************************/ #include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std; typedef long long LL;
//typedef vector<LL> Vec;
//typedef vector<Vec> Mat; struct Mat{
LL a[3][3];
Mat(){ memset(a,0,sizeof(a)); }
};
LL T,p,m,n,k,a0,phi;
LL ans1,ans2; char *ps=(char *)malloc(20000000);
inline LL in(LL x=0){ for(;*ps>'9'||*ps<'0';ps++);
for(;*ps>='0'&&*ps<='9';ps++) x=(x<<3)+(x<<1)+*ps-'0';return x; }
inline void Out(LL x){
int l=0;char ch[65];
if(!x){ putchar('0');return; }
if(x<0) putchar('-'),x=-x;
while(x) ch[++l]=x%10+'0',x/=10;
for(int i=l;i;i--) putchar(ch[i]);
}
inline LL GetPhi(LL p){
LL res=p,m=sqrt(p)+0.5;
for(int i=2;i<=m;i++) if(p%i==0){
res=res/i*(i-1);
while(p%i==0) p/=i;
}
if(p>1) res=res/p*(p-1);return res;
}
inline LL Mul(LL a,LL b,LL p){
LL t1=b/1000000,t2=b%1000000;
return ((t1*a)%p*1000000%p+t2*a%p)%p;
}
inline LL Pow(LL a,LL b,LL p,LL res=1){ for(;b;b>>=1,a=Mul(a,a,p)) if(b&1) res=Mul(res,a,p);return res; }
Mat operator * (const Mat &A,const Mat &B){
Mat C;
for(int i=0;i<3;i++) for(int j=0;j<3;j++) for(int k=0;k<3;k++)
C.a[i][j]=(C.a[i][j]+Mul(A.a[i][k],B.a[k][j],phi))%phi;
return C;
}
Mat operator ^ (Mat A,LL b){
Mat res;
for(int i=0;i<3;i++) for(int j=0;j<3;j++) res.a[i][j]=(i==j)?1:0;
for(;b;b>>=1,A=A*A) if(b&1) res=res*A;
return res;
} int main(){
// freopen("maths.in","r",stdin);
// freopen("maths.out","w",stdout);
// ios::sync_with_stdio(false);
fread(ps,1,20000000,stdin);
Mat A;
for(T=in(),p=in(),phi=GetPhi(p);T--;){
m=in()%phi,a0=in()%p,k=in()%p,n=in(); // cout<<Mul(n,Pow(n,5))<<endl;
// cout<<m<<" "<<a0<<" "<<k<<" "<<n<<endl;
ans1=Pow(a0,Pow(m,n,phi),p);
// cout<<ans1<<endl;
A.a[0][0]=m,A.a[0][1]=1,A.a[0][2]=0;
A.a[1][0]=0,A.a[1][1]=1,A.a[1][2]=1;
A.a[2][0]=0,A.a[2][1]=0,A.a[2][2]=1;
A=A^(n-1);
ans2=Pow(k,((A.a[0][0]+2*A.a[0][1])%phi+A.a[0][2])%phi,p);
// cout<<ans1<<" "<<ans2<<endl;
Out(Mul(ans1,ans2,p)),putchar('\n');
// printf("%I64d\n",Mul(ans1,ans2,p));
}
return 0;
}

  

BZOJ 3665: maths的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  3. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  4. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  5. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  6. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

  7. 【sdoi2013】森林 BZOJ 3123

    Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...

  8. 【清华集训】楼房重建 BZOJ 2957

    Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...

  9. 【splay】文艺平衡树 BZOJ 3223

    Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3  ...

随机推荐

  1. matlab————矩阵输出到txt

    matlab如何输出矩阵到txt并指定数的精度 (2013-11-20 16:50:43)转载▼ 标签: matlab 输出数据 假设你的数据矩阵为a; [m n] = size(a); [filen ...

  2. 第四章 电商云化,4.1 17.5W秒级交易峰值下的混合云弹性架构之路(作者:唐三 乐竹 锐晟 潇谦)

    4.1 17.5W秒级交易峰值下的混合云弹性架构之路 前言 每年的双11都是一个全球狂欢的节日,随着每年交易逐年创造奇迹的背后,按照传统的方式,我们的成本也在逐年上升.双11当天的秒级交易峰值平时的近 ...

  3. Android学习笔记——MixLayout

    该工程的功能是实现LinearLayout+TableLayout 以下代码是MainActivity.java中的代码 package com.example.mixlayout; import a ...

  4. header的安全配置指南

    0x00 背景 在统计了Alexa top 100万网站的header安全分析之后(2012年11月 - 2013年3月 - 2013年11月),我们发现其实如何正确的设置一个header并不是一件容 ...

  5. IIS发布WCF遇到的问题总结

    1.安装.NET Framework和VS以后才装的,ASP.NET也没装上,所以一般情况下,只需要运行那个众所周知的“aspnet_regiis -i”命令就行了.但是Windows 8上这个命令是 ...

  6. nginx重定向配置

    # /etc/nginx/nginx.conf #写在server,location核心模块中,if也可以写.$http_host客户端设法要到达主机的主机名 if ($http_host !~ “^ ...

  7. IOS: 模型面数控制

    你可以先试试 生成之后在虚拟机上运行一下就知道了 不过关键也看手机的好坏 場景 人物 面數的話越少越好(但要保持模型的完整)  貼圖解析度也不要太大 資料越少越好 //================ ...

  8. BeanNameAware接口和BeanFactoryAware接口

    迄今为止,所接触到的Bean都是“无知觉”的,就像黑客帝国中机械工厂里面“养殖”的人类,他们虽然能完成一定的功能,但是根本不知道自己在工厂(BeanFactory)中的代号(id),或者自己是在哪个工 ...

  9. QQ空间HD(3)-Modal的切换效果总结

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { UIViewController ...

  10. 分布式缓存之 memcache 实现分布式缓存

    最近想搞点分布式,但是不知道整点什么,来点简单的吧. 今天讲下memcache的分布式缓存 首先下载memcache的服务器端 百度下可以找到 然后执行安装和开启(关闭服务器)命令(还有其他的命令 可 ...