急速求解。谢谢(&#微星3665h主板参数;• . •&#微星3665h主板参数;)

矩阵乘法+快速幂+欧拉定理.
首先观察题目可以发现 \(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\) 感觉可以过...然后为了卡常数...什么都写了...
/**************************************************************
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&
typedef long long LL;
//typedef vector&LL& V
//typedef vector&Vec& M
struct Mat{
LL a[3][3];
Mat(){ memset(a,0,sizeof(a)); }
LL T,p,m,n,k,a0,
LL ans1,ans2;
char *ps=(char *)malloc();
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'; }
inline void Out(LL x){
int l=0;char ch[65];
if(!x){ putchar('0'); }
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);
inline LL Mul(LL a,LL b,LL p){
LL t1=b/=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); }
Mat operator * (const Mat &A,const Mat &B){
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))%
Mat operator ^ (Mat A,LL b){
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;
int main(){
freopen("maths.in","r",stdin);
freopen("maths.out","w",stdout);
ios::sync_with_stdio(false);
fread(ps,1,,stdin);
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))&&
cout&&m&&" "&&a0&&" "&&k&&" "&&n&&
ans1=Pow(a0,Pow(m,n,phi),p);
cout&&ans1&&
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&&
Out(Mul(ans1,ans2,p)),putchar('\n');
printf("%I64d\n",Mul(ans1,ans2,p));
阅读(...) 评论()Joyful Life, Simple Joyful...
『注意』北京互联网协会公布的十大流氓软件名单
第一名:3721上网助手
所属公司:北京三七二一科技有限公司
厂商网址:
&(字节数: 9197)
已成功添加“”到 个分组
请不要超过6个字๑۩۞۩&
最近不知道是为什么
心里好憋屈& 好想哭
一直都不想让大家看到我脆弱的一面
一直都喜欢把最坚强的自己留给大家
但这样的我好累
总是希望在我累的时候能有一个肩膀可以让我依靠
当我哭是时候能有人陪在我身边
有好多好多的希望在心里
一个离我很遥远的词语
已经记不清楚自己曾经的幸福是在什么时候了
也已经记不清楚那个给我幸福感觉的他现在在哪里
自己像是一个迷路的小孩找不到通往幸福的路
迷路的我变得叛逆了很多
因为没有人会在乎我&
没有人会注意我
所以我会用很多事情来引起大家的注意
可是结果......
就这样我被人遗弃了一样
可是倔强的性格不允许我掉眼泪
所以幸福的感觉&
我走进了劲舞的世界
很快我爱上了这个游戏
因为它能满足我的虚荣心
就在我将要把幸福这个词语忘记的时候
是他让我慢慢的感受到了久违的幸福的感觉
在游戏里我知道了被人在乎是什么样子的
可是没想到他从游戏来到了我现实的生活中
第一次被一个人那样的在乎
第一次会有人因为我的开心而开心
因为我被欺负而气愤
因为我伤心而心痛
真的很感谢你
是你让我知道了幸福的滋味就是甜甜的
是你让我体会到了被一个人在乎是那么美好的事情
也很感谢劲舞
孤独的时候能让我得到小小的满足
在我得到满足的时候也得到了他给我带来的幸福
原来幸福就像是棒棒糖一样
就像是这淡淡的粉色
暖暖的& 很温馨
幸福就是每天都要听见你的声音
然后才会安心的睡觉
幸福就是想你会想到哭&
可是那泪水却是甜甜的
幸福就是彼此之间的在乎
幸福就是彼此之间的牵挂与想念
谢谢你给予我的幸福
我会好好的珍惜
谢谢你给予我的快乐
我会好好的保留
谢谢你给予我的一切
我会永远记住那个爱我和我爱的你&
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

参考资料

 

随机推荐