「CodePlus 2017 12 月赛」可做题2(矩阵快速幂+exgcd+二分)
2024-09-28 11:44:59
昨天这题死活调不出来结果是一个地方没取模,凉凉。
首先有个一眼就能看出来的规律...
斐波那契数列满足$a_1, a_2, a_1+a_2, a_1+2a_2, 2a_1+3a_2, 3a_1+5a_2$
也就是第k项是$fib(k-2)*a_1+fib(k-1)*a_2$
问题就转化成了求$(fib(k-2)*a_1+fib(k-1)*a_2)\% p=m$,$a_2$在$[l,r]$上的个数。
显然$fib(k-2)a_1$是个常数,那一看就是exgcd题了。。。
令$a=fib(k-1),b=p,c=(m-fib(k-2)*a_1\% p+p)\% p$
然后就变成了求$ax+by=c$,$x$在$[l,r]$上有几个解。
先求出最小正整数解,然后二分一下就完了。
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#define ll long long
#define int long long
using namespace std;
const int maxn=, inf=1e9;
int n, a1, l, r, K, p, m, T, mod, x, y;
struct mtx {int mp[][];mtx(){memset(mp, , sizeof(mp));}}base, ans;
inline void read(int &k)
{
int f=; k=; char c=getchar();
while(c<'' || c>'') c=='-'&&(f=-), c=getchar();
while(c<='' && c>='') k=k*+c-'', c=getchar();
k*=f;
}
mtx operator*(mtx a, mtx b)
{
mtx c;
for(int i=;i<;i++)
for(int j=;j<;j++)
for(int k=;k<;k++)
c.mp[i][j]=(c.mp[i][j]+a.mp[i][k]*b.mp[k][j])%p;
return c;
}
void power(int b)
{
for(;b;b>>=, base=base*base)
if(b&) ans=ans*base;
}
int exgcd(int a, int b, int &x, int &y)
{
if(!b) return x=, y=, a;
int ans=exgcd(b, a%b, x, y);
int tmp=x; x=y; y=tmp-a/b*y;
return ans;
}
inline ll find(int x, int up)
{
int l=, r=up/p+;
while(l<r)
{
int mid=(l+r)>>;
if(x+p*mid>=up) r=mid;
else l=mid+;
}
return l;
}
#undef int
int main()
{
read(T);
while(T--)
{
base.mp[][]=base.mp[][]=base.mp[][]=; base.mp[][]=;
ans.mp[][]=ans.mp[][]=; ans.mp[][]=ans.mp[][]=;
read(a1); read(l); read(r); read(K); read(p); read(m); a1%=p;
power(K-); mod=(m-a1*ans.mp[][]%p+p)%p;
int d=exgcd(ans.mp[][], p, x, y);
if(mod%d!=) {puts(""); continue;}
x=x*(mod/d); p/=d; x=(x%p+p)%p;
printf("%lld\n", find(x, r+)-find(x, l));
}
}
最新文章
- ora-02292
- servlet定义
- listview可见再加载图片
- Servlet之HttpServletResponse和HttpServletRequest
- canvas加载gif
- MySQL主从复制的原理及配置
- Spring MVC中如何指定某个类或方法自适配地响应某个HTTP请求?
- 找第k大数,最坏时间复杂度O(n)
- Windows环境下最新OpenCV和Contribute代码的联合编译
- 201521123052《Java程序设计》第4周学习总结
- 十分钟学会Java8:lambda表达式和Stream API
- 源设置导致Docker镜像构建失败
- Laravel Cache 缓存钉钉微应用的 Access Token
- mongodb的优缺点
- Android_OnLowMemory和OnTrimMemory
- 关于CALayer 中的contents(图片) 拉伸
- C++复合类型(数组)
- 网页访问过程(基于CDN)
- Shell中三种引号的用法及区别
- 洛谷P2812 校园网络[数据加强版] [Tarjan]