校内训练0602 习题exercise
【题目大意】
f(i)=((Af(i-1)+B)/(Cf(i-1)+D)) mod P。
给出f(0), A, B, C, D, P, n,求f(n)。
多组数据T<=1e4
n<=1e18, P <= 1e9, |f(0)|,|A|,|B|,|C|,|D| <= 1e9
保证任何时候存在逆元。
【题解】
首先我们有一种O(TP)的做法:找循环节。
考场上因为数据原因是可以AC的。。
# include <map>
# include <stdio.h>
# include <assert.h>
# include <string.h>
# include <iostream>
# include <algorithm>
// # include <bits/stdc++.h> using namespace std; typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int M = 5e5 + ; # define RG register
# define ST static int A, B, C, D, mod, lm, rm;
ll f[], n;
map<int, int> mp; inline ll exgcd(ll a, ll b, ll &x, ll &y) {
if(b == ) {
x = ;
y = ;
return a;
}
exgcd(b, a%b, x, y);
ll t = x;
x = y;
y = t - (a/b)*y;
} inline ll getinv(ll n) {
ll x, y;
exgcd(n, (ll)mod, x, y);
x = (x%mod + mod) % mod;
return x;
} inline void sol() {
scanf("%lld%d%d%d%d%lld%d", &f[], &A, &B, &C, &D, &n, &mod);
A = (A+mod)%mod; B = (B+mod)%mod;
C = (C+mod)%mod; D = (D+mod)%mod;
mp.clear(); lm = rm = -; mp[f[]] = ;
for (int i=; i<=mod; ++i) {
f[i] = (A*f[i-] + B) % mod * getinv(C*f[i-] + D) % mod;
if(mp.find(f[i]) != mp.end()) {
lm = mp[f[i]], rm = i;
break;
}
mp[f[i]] = i;
}
// printf("%d %d\n", lm, rm);
assert(lm != - && rm != -);
if(n <= lm) printf("%lld\n", f[n]);
else printf("%lld\n", f[(n-lm)%(rm-lm)+lm]);
} int main() {
freopen("exercise.in", "r", stdin);
freopen("exercise.out", "w", stdout);
int T; cin >> T;
while(T--) sol();
return ;
}
标准做法是
f(i)=((Af(i-1)+B)/(Cf(i-1)+D))
f(i-1)=((Af(i-2)+B)/(Cf(i-2)+D))
那么
f(i)=((A^2+BC)f(i-2)+(AB+BD))//((AC+CD)f(i-2)+(CD+D^2))
相当于两个2*2的矩阵乘在一起。
那么矩乘即可。
# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm>
// # include <bits/stdc++.h> using namespace std; typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int M = 5e5 + ; # define RG register
# define ST static int f0, A, B, C, D, mod, ans;
ll n; inline ll exgcd(ll a, ll b, ll &x, ll &y) {
if(b == ) {
x = ;
y = ;
return a;
}
exgcd(b, a%b, x, y);
ll t = x;
x = y;
y = t - (a/b)*y;
} inline int getinv(ll n) {
ll x, y;
exgcd(n, (ll)mod, x, y);
x = (x%mod + mod) % mod;
return x;
} struct matrix {
int a[][], n;
inline void set() {memset(a, , sizeof a);}
friend matrix operator * (matrix a, matrix b) {
matrix c; c.set();
for (int i=; i<=; ++i)
for (int j=; j<=; ++j)
for (int k=; k<=; ++k)
(c.a[i][j] += 1ll * a.a[i][k] * b.a[k][j] % mod) %= mod;
return c;
}
friend matrix operator ^ (matrix a, ll b) {
matrix c; c.set(); c.a[][] = c.a[][] = ;
while(b) {
if(b&) c=c*a;
a=a*a;
b >>= ;
}
return c;
}
}E; inline void sol() {
scanf("%d%d%d%d%d%lld%d", &f0, &A, &B, &C, &D, &n, &mod);
A = (A+mod) % mod; B = (B+mod) % mod; C = (C+mod) % mod; D = (D+mod) % mod;
E.set(); E.a[][] = A, E.a[][] = B, E.a[][] = C, E.a[][] = D;
E = E^n;
A = E.a[][], B = E.a[][], C = E.a[][], D = E.a[][];
ans = getinv((ll)C * f0 + D);
ans = 1ll * ans * (1ll * A * f0 % mod + B) % mod;
printf("%d\n", ans);
} int main() {
freopen("exercise.in", "r", stdin);
freopen("exercise.out", "w", stdout);
int T; cin >> T;
while(T--) sol();
return ;
}
校内训练0602 习题exercise的更多相关文章
- [4.14校内训练赛by hzwer]
来自FallDream的博客,未经允许,请勿转载,谢谢. hzwer又出丧题虐人 4道noi.... 很奇怪 每次黄学长出题总有一题我做过了. 嗯题目你们自己看看呗 好难解释 ----- ...
- [2017.4.7校内训练赛by hzwer]
来自FallDream的博客,未经允许,请勿转载,谢谢. 报警啦.......hzwer又出丧题虐人啦..... 4道ctsc...有一道前几天做过了,一道傻逼哈希还wa了十几次,勉强过了3题..我好 ...
- [3.24校内训练赛by hzwer]
来自FallDream的博客,未经允许,请勿转载,谢谢. ----------------------------------------------------------------------- ...
- 19_04_19校内训练[Game]
题意 给出n,等概率地生成一个1~n的数列.现在有n个人从左到右站成一排,每个人拿有当前数列位置上的数字,并且一开始都不知道数字是多少(但知道n是多少).从左到右让每个人进行如下选择: 1.选择保留自 ...
- 19_04_02校内训练[deadline]
题意 给出一个二分图,左边为A集合,右边为B集合,要求把A集合中每一个点染为黑白两色中的一种,B集合中的颜色已定.染色后对于原本相邻且颜色相同的点,建立新的二分图,即得到了两个新的二分图,它们是独立的 ...
- 平面图转对偶图&19_03_21校内训练 [Everfeel]
对于每个平面图,都有唯一一个对偶图与之对应.若G‘是平面图G的对偶图,则满足: G'中每一条边的两个节点对应着G中有公共边的面,包括最外部无限大的面. 直观地讲,红色标出来的图就是蓝色标出的图的对偶图 ...
- fzyzojP3979 -- [校内训练20180914]魔法方阵
原题见CF632F https://blog.csdn.net/Steaunk/article/details/80217764 这个比较神仙了 点边转化, 把max硬生生转化成了路径最大值,再考虑所 ...
- fzyzojP3580 -- [校内训练-互测20180315]小基的高智商测试
题目还有一个条件是,x>y的y只会出现一次(每个数直接大于它的只有一个) n<=5000 是[HNOI2015]实验比较 的加强版 g(i,j,k)其实可以递推:g(i,j,k)=g(i- ...
- fzyzojP3372 -- [校内训练20171124]博弈问题
对于每个点都要答案 还是异或 trie树合并石锤了 朴素枚举是O(n^2*17)的 怎么办呢? 我们发现合并的时候,一些部分的trie的子树还是不变的 改变的部分也就是合并的复杂度可以接受 鉴于大部分 ...
随机推荐
- 45.VUE学习之--组件之父组件使用scope定义子组件模板样式结构实例讲解
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- sed命令例子详解
sed -e '/Patricia/h' -e '/Margot/x' datafile 包含Margot的行将被包含Patricia的行替换: sed -e /WE/{h;d;}' -e '/CT/ ...
- 初见spark-02(RDD及其简单算子)
今天,我们来进入spark学习的第二章,发现有很多事都已经开始变化,生活没有简单的朝自己想去的方向,但是还是需要努力呀,不说鸡汤之类的话了, 开始我们今天的spark的旅程 一.RDD是什么 rdd的 ...
- 菜鸟学Linux - Tarball安装的一般步骤
所谓的Tarball软件,实际上指的是从网络上下载到的源码包.通常是以.tar.gz和tar.bz2结尾.至于gz和bz2的区别在于压缩算法的不同(bz2的压缩效果好像好一些).源码包下载完成后,需要 ...
- HTML中body相关标签-02
今日内容: 字体标签: h1~h6.<font>.<u>.<b>.<strong><em>.<sup>.<sub> ...
- PowerCmd
今天在手机上看慕课网,看到一个好玩的东西.Powercmd. 一开始的感觉是,妈的,我会cmd命令,为什么要用你的cmd? 后来,用了之后,感觉,嗯,还是Powercmd好用.功能强大. 我们来看看它 ...
- java文件基本操作
public static void main(String [] args) { try { /* * File类 */ /*String directory = "D:/Workspac ...
- 宝石TD迷宫设计器
说起宝石TD,能追溯到我上高二那会,算来是2005年. 所谓一款TD类的魔兽RPG,宝石TD可以算是达到了TD迷宫的巅峰,三进三出更是别具匠心. 这个迷宫设计器是去年在焦作做的,只完成了迷宫设计功能, ...
- 将有效慢日志转存到数据库v2
import re import sys import getopt import MySQLdb from subprocess import call import os host='10.76. ...
- python 之发送邮件服务[原著] 海瑞博客
Python 发送邮件 使用默认的django的发送邮件,只适用于单邮箱. 作者:海瑞博客 http://www.hairuinet.com/ setting中配置 # send e-mail EMA ...