Comet OJ Contest #13 D
Comet OJ Contest #13 D
\(\displaystyle \sum_{i=0}^{\left\lfloor\frac{n}{2}\right\rfloor} a^{i} b^{n-2 i}\left(\begin{array}{c}{n} \\ {2 i}\end{array}\right)\)
$ T \leq 10^4 , n , m , p \leq 10^{18} $
注意,由于 $ p $ 不一定是质数,而且数据范围看起来很快速幂所有貌似只能快速幂。
这个式子可以化成:
\(\displaystyle \sum_{i=0}^{\left\lfloor\frac{n}{2}\right\rfloor} {\sqrt a}^{2i} b^{n-2 i}\left(\begin{array}{c}{n} \\ {2 i}\end{array}\right)\)
然后其实就是 $ (\sqrt a + b)^n $ 的偶数次项的和。
偶数次项其实可以化成 $ \frac{1}{2} ( (\sqrt a + b)^n - (\sqrt a - b) ^ n ) $ 当然这是当 $ n $ 为偶数时,如果是奇数要反过来。
这个式子可以直接类似复数的快速幂,因为我们知道最后一定不会剩下根号。
当然,也可以看成一个特征方程的根,就是一个 $ f(1) = 1 , f(2) = b , f(n) = 2bf(n - 1) + (-b^2+a) f(n - 2) $。
/*Heroes Never Die!*/
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
#define int __int128_t
#define ll __int128_t
#define N 2
struct mtrx{
ll a[3][3];
} tmp , cur , ans ;
ll a , b , P;
void mul( mtrx& a , mtrx& b ) {
memset(tmp.a,0,sizeof tmp.a);
for( ll i = 0 ; i < N ; ++ i )
for( ll p = 0 ; p < N ; ++ p )
if(a.a[i][p])
for( ll j = 0 ; j < N ; ++ j )
tmp.a[i][j] += a.a[i][p] * b.a[p][j] , tmp.a[i][j] %= P;
}
void power( ll n ) {
memset(cur.a , 0 , sizeof cur.a) , memset(ans.a,0,sizeof ans.a);
cur.a[0][0] = 2 * b % P , cur.a[0][1] = ( - b * b % P + a + P ) % P;
cur.a[1][0] = 1;
ans.a[0][0] = 1, ans.a[1][1] = 1;
while( n ) {
if( n & 1 ) mul( ans , cur ) , ans = tmp;
mul( cur , cur ) , cur = tmp , n >>= 1 ;
}
}
ll n;
inline __int128_t read()
{
int X=0,w=0; char ch=0;
while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
return w?-X:X;
}
inline void print(__int128_t x)
{
if(x<0){putchar('-');x=-x;}
if(x>9) print(x/10);
putchar(x%10+'0');
}
signed main() {
//freopen("input","r",stdin);
signed T; cin >> T;
while( T-- ){
n = read() , a = read() , b = read( ) , P = read();
power(n - 1);
print((ans.a[0][0] * b % P + ans.a[0][1]) % P); puts("");
}
}
//qwq
Comet OJ Contest #13 D的更多相关文章
- Comet OJ - Contest #13 「火鼠的皮衣 -不焦躁的内心-」
来源:Comet OJ - Contest #13 芝士相关: 复平面在信息学奥赛中的应用[雾 其实是道 sb 题??? 发现原式貌似十分可二项式定理,然后发现确实如此 我们把 \(a^i\) 替换成 ...
- Comet OJ - Contest #13 「佛御石之钵 -不碎的意志-」(hard)
来源:Comet OJ - Contest #13 一眼并查集,然后发现这题 tmd 要卡常数的说卧槽... 发现这里又要用并查集跳过访问点,又要用并查集维护联通块,于是开俩并查集分别维护就好了 一开 ...
- Comet OJ Contest #13 简要题解
C2 首先用并查集维护\(1\)的连通块,然后用另外一个并查集维护第\(i\)行中,第\(j\)列之后的第一个\(0\)的位置,就是如果当前位置是\(1\)那么它的父亲是它右边的格子,否则是它自己. ...
- Comet OJ - Contest #13 「佛御石之钵 -不碎的意志-」(困难版) 并查集
题意 给一个$ n \times m$ 的网格,每个格子里有一个数字,非 \(0\) 即 \(1\),行从上往下依次编号为 \(1, 2, \cdots, n\),列从左往右依次编号为 \(1, 2, ...
- Comet OJ - Contest #13
Rank53. 第一次打这种比赛.还是有不少问题的,以后改吧. A题WA了两次罚了不少时. C写到一半发现只能过1,就先弃了. D一眼没看出来.第二眼看出来就是一个类似于复数的快速幂. 然后B切了. ...
- Comet OJ - Contest #2 简要题解
Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...
- Comet OJ - Contest #2简要题解
Comet OJ - Contest #2简要题解 前言: 我没有小裙子,我太菜了. A 因自过去而至的残响起舞 https://www.cometoj.com/contest/37/problem/ ...
- Comet OJ - Contest #4--前缀和
原题:Comet OJ - Contest #4-B https://www.cometoj.com/contest/39/problem/B?problem_id=1577传送门 一开始就想着暴力打 ...
- Comet OJ - Contest #11 题解&赛后总结
Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...
随机推荐
- JBOSS未授权访问漏洞利用
1. 环境搭建 https://www.cnblogs.com/chengNo1/p/14297387.html 搭建好vulhub平台后 进入对应漏洞目录 cd vulhub/jboss/CVE-2 ...
- 第一次Scrum Metting
日期: 2021年4月23日 会议主要内容: 会议主要各自介绍一下所做任务,讨论了前后端接口定义以及服务器购买和接下来任务分配. 一.进度情况 组员 负责 两日已完成的工作 后两日计划完成的工作 工作 ...
- C++学习笔记之pimpl用法详解
原文链接:https://www.jb51.net/article/122557.htm 在编写稳定代码是,管理好代码间的依赖性是不可缺少的一个环节.特别是库文件的编写中,减少代码间的依赖性可以提供一 ...
- repo学习总结
转载:https://blog.csdn.net/salmon_zhang/article/details/79180075 1. repo简介 repo是Google开发的用于管理Android版本 ...
- 栈的压入、弹出顺序 牛客网 剑指Offer
栈的压入.弹出顺序 牛客网 剑指Offer 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是 ...
- JAVA笔记__窗体类/Panel类/Toolkit类
/** * 窗体类 */ public class Main { public static void main(String[] args) { MyFrame m1 = new MyFrame() ...
- c++ 算法 next_permutation
遇到这个算法是在大牛写的10行的8皇后问题中,下面首先给出这个10行就解决了8皇后的NB代码,我目前还是没有看懂对于皇后不在同一列的判断,因为他巧妙的用了移位操作. #include<iostr ...
- VSCode PHP 开发环境配置 详细教程
VSCode PHP 开发环境配置 详细教程 这篇文章主要介绍了VScode+PHPstudy配置PHP开发环境的步骤,整理了官方以及优秀第三方的内容,对于学习和工作有一定借鉴意义. 配置过程 第一步 ...
- 设计模式--策略模式Strategy
策略模式 算法经常需要被改变==使用S 节省资源(很多if else if-.不会被执行,却会被装载到代码段) 动机 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到 ...
- JMeter学习笔记--函数学习(_csvRead 函数)
JMeter函数可以很方便实现一些小功能,几乎可以用于测试计划中的任何元件.一个函数的调用如下:${_functionName(var1,var2,var3)},_functionName匹配函数名, ...