【题意】数列满足an=an-1+an-2,n>=3。现在a1=i,a2=[l,r],要求满足ak%p=m的整数a2有多少个。10^18。

【算法】数论(扩欧)+矩阵快速幂

【题解】定义fib(i)表示第 i 个斐波那契数,将数列an列项观察容易发现ak=a1*fib(k-2)+a2*fib(k-1)。fib(i)可以用矩阵快速幂迅速得解。

现在实际已知ak%p,a1,fib(k-2),fib(k-1),令a=fib(k-1),b=m-i*fib(k-2),x=a2,则方程转化为:ax≡b(%p),求解x=[l,r]的整数解。

运用扩展欧几里得定理求解即可,下面展示具体细节:

1.转化为不定方程,ax-py=b。

2.g=gcd(a,p),若b%p≠0则无解(输出0)。

3.a/=g;p/=g;b/=g;

4.求解a'x-b'y=1即exgcd(a,p,x,y),得到x0=x*b。

5.得到最小非负整数解x(这是为了防止x0>l)

6.计算在[l,r]之间的解,calc(r,x)=(r-b)%p+1。

注意:

1.读入 i 后取模。

2.先算原解x0,再扩展。

3.namespace中任何元素都不能重名。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll x1,l,r,k,m;
int p;
int MOD(int x){return x>=p?x-p:x;}
namespace fib{
int ans[][],tmp[][],c[][];
void mul(int a[][],int b[][]){
for(int i=;i<;i++)
for(int j=;j<;j++){
c[i][j]=;
for(int k=;k<;k++)
c[i][j]=MOD(c[i][j]+1ll*a[i][k]*b[k][j]%p);
}
for(int i=;i<;i++)for(int j=;j<;j++)a[i][j]=c[i][j];
}
int f(ll x){
x--;
ans[][]=;ans[][]=ans[][]=ans[][]=;
tmp[][]=tmp[][]=tmp[][]=;tmp[][]=;
while(x){
if(x&)mul(ans,tmp);
mul(tmp,tmp);
x>>=;
}
return ans[][];
}
}
int M(ll x){return (x%p+p)%p;}
void exgcd(int a,int b,int& x,int& y){
if(!b){x=;y=;}
else{exgcd(b,a%b,y,x);y-=x*(a/b);}
}
int gcd(int a,int b){return b?gcd(b,a%b):a;}
ll calc(ll r,int x){return r<x?:(r-x)/p+;}
int main(){
int T;scanf("%d",&T);
while(T--){
scanf("%lld%lld%lld%lld%d%lld",&x1,&l,&r,&k,&p,&m);//x1%p!!!
int b=M(m-x1%p*fib::f(k-)),a=fib::f(k-),x,y;
int g=gcd(a,p);
if(b%g){printf("0\n");continue;}
a/=g;b/=g;p/=g;
exgcd(a,p,x,y);
x=M(1ll*x*b);//M(1ll*x*b)!!!
printf("%lld\n",calc(r,x)-calc(l-,x));
}
return ;
}

【LibreOJ】#6257. 「CodePlus 2017 12 月赛」可做题2的更多相关文章

  1. 【LIbreOJ】#6256. 「CodePlus 2017 12 月赛」可做题1

    [题意]定义一个n阶正方形矩阵为“巧妙的”当且仅当:任意选择其中n个不同行列的数字之和相同. 给定n*m的矩阵,T次询问以(x,y)为左上角的k阶矩阵是否巧妙.n,m<=500,T<=10 ...

  2. 「CodePlus 2017 12 月赛」可做题2(矩阵快速幂+exgcd+二分)

    昨天这题死活调不出来结果是一个地方没取模,凉凉. 首先有个一眼就能看出来的规律... 斐波那契数列满足$a_1, a_2, a_1+a_2, a_1+2a_2, 2a_1+3a_2, 3a_1+5a_ ...

  3. 「CodePlus 2017 11 月赛」可做题

    这种题先二进制拆位,显然改的位置只有每一段确定的数的开头和结尾,只需要对于每一个可决策位置都尝试一下填1和0,然后取min即可. #include<iostream> #include&l ...

  4. [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞

    [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞 试题描述 到河北省 见斯大林 / 在月光下 你的背影 / 让我们一起跳舞吧 うそだよ~ 河北省怎么可能有 Stalin. ...

  5. 【LibreOJ】#6259. 「CodePlus 2017 12 月赛」白金元首与独舞

    [题目]给定n行m列的矩阵,每个位置有一个指示方向(上下左右)或没有指示方向(任意选择),要求给未定格(没有指示方向的位置)确定方向,使得从任意一个开始走都可以都出矩阵,求方案数.n,m<=20 ...

  6. 「CodePlus 2017 12 月赛」火锅盛宴(模拟+树状数组)

    1A,拿来练手的好题 用一个优先队列按煮熟时间从小到大排序,被煮熟了就弹出来. 用n个vector维护每种食物的煮熟时间,显然是有序的. 用树状数组维护每种煮熟食物的数量. 每次操作前把优先队列里煮熟 ...

  7. 「CodePlus 2017 12 月赛」白金元首与独舞

    description 题面 data range \[ 1 \leq T \leq 10, 1 \leq n, m \leq 200 , 0 \leq k \leq \min(nm, 300)\] ...

  8. 走进矩阵树定理--「CodePlus 2017 12 月赛」白金元首与独舞

    n,m<=200,n*m的方阵,有ULRD表示在这个格子时下一步要走到哪里,有一些待决策的格子用.表示,可以填ULRD任意一个,问有多少种填法使得从每个格子出发都能走出这个方阵,答案取模.保证未 ...

  9. 「CodePlus 2017 12 月赛」火锅盛宴

    n<=100000种食物,给每个食物煮熟时间,有q<=500000个操作:在某时刻插入某个食物:查询熟食中编号最小的并删除之:查询是否有编号为id的食物,如果有查询是否有编号为id的熟食, ...

随机推荐

  1. lintcode-512-解码方法

    512-解码方法 有一个消息包含A-Z通过以下规则编码 'A' -> 1 'B' -> 2 ... 'Z' -> 26 现在给你一个加密过后的消息,问有几种解码的方式 样例 给你的消 ...

  2. Swift-自定义类的构造函数

    构造函数类似oc中的init方法默认情况下,创建一个,类会调用一个构造函数即使没写任何构造函数,编译器会默认一个构造函数如果是继承NSObject,可以对构造函数重写 class Person: NS ...

  3. 【Linux 命令】- tar 命令

    语法 tar [-ABcdgGhiklmMoOpPrRsStuUvwWxzZ][-b <区块数目>][-C <目的目录>][-f <备份文件>][-F <Sc ...

  4. 用友 SAP 金蝶 季报

    用友 2018Q3季报 营收:.42亿 营收收入同比增长:42.36% 净利润:.35万 净利润同比增长率:113.83% 销售毛利率:66.88% 销售净利率:19.29% 用友2017财年年报 营 ...

  5. vue-cli3使用 DllPlugin 实现预编译,提升构建速度

    在项目打包上有两个目标:减少打包代码体积和加快打包速度 1. 减少打包体积: (1)对于用的比较少的库,可以去掉(我去掉了jquery以及lodash),用到的地方,参考源码自己写 (2)非用不可的又 ...

  6. mysql 中文字段排序

    方法1)select * from mytable order by CONVERT(chineseColumnName USING gbk);  (备注:chineseColumnName 位排序字 ...

  7. PHP内置标准类

    PHP内置标准类 php语言内部,有“很多现成的类”,其中有一个,被称为“内置标准类”. 这个类“内部”可以认为什么都没有,类似这样: class  stdclass{ } 其作用,可以用于存储一些临 ...

  8. bzoj2818 Gcd(欧拉函数)

    Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. Input 一个整数N Output 如题 Sample Input 4 Sam ...

  9. bzoj4770 图样

    题意 n个点的完全图,每个点的点权是在m位的二进制数中随机选取的.每条边的边权是两个点的点权的异或值. 问最小生成树的边权和的期望.模一个质数输出. 分析 考试的时候写这个题,然后期望得分100-&g ...

  10. Selenium操作滚动条

    //移动到元素element对象的“顶端”与当前窗口的“顶部”对齐 ((JavascriptExecutor) driver).executeScript("arguments[0].scr ...