zoukankan      html  css  js  c++  java
  • CodePlus2017 12月月赛 div2可做题2

    11月的月赛错过了,来打12月月赛,由于很(zi)想(ji)拿(tai)衣(ruo)服(la),所以去打div2。

    T1是一个sb模拟,但是机房全卡死在这道语文题上了,基本上弄了一个半小时,T2可以秒杀,T4像一个数据结构神题,写了4个set+1个树状数组水了水。

    然后就剩下我最怕的数学题。llj说这道题式子贼好推,你做做吧。我瑟瑟发抖。

    下来看这道题,确实是道比较简单的数学题。

    我们假设$F_i$为斐波那契数列的第$i$项,

    那么这道题第$k$项就应该是$A_k = A_1 imes F_{k-2} + A_2 imes F_{k-1}$

    那么我们需要求满足$A_1 imes F_{k-2} + A_2 imes F_{k-1} equiv m pmod{p}$的$A_2$的个数。

    那么直接用exgcd求最小整数解就可以啦。

    (update 1229)贴个代码:

    //Serene
    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    #define ll long long
    ll T,p,n,m;
    ll f[3],g[3][3],f2[3],g2[3][3];
    
    ll aa;char cc;
    ll read() {
    	aa=0;cc=getchar();
    	while(cc<'0'||cc>'9') cc=getchar();
    	while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
    	return aa;
    }
    
    ll gcd(ll x,ll y) {
    	return y==0? x:gcd(y,x%y);
    }
    
    void cf1() {
    	memcpy(f2,f,sizeof(f));
    	f[1]=f2[1]*g[1][1]%p+f2[2]*g[2][1]%p;
    	f[2]=f2[1]*g[1][2]%p+f2[2]*g[2][2]%p;
    	if(f[1]>=p) f[1]-=p;
    	if(f[2]>=p) f[2]-=p;
    }
    
    void cf2() {
    	memcpy(g2,g,sizeof(g));
    	memset(g,0,sizeof(g));
    	for(int i=1;i<=2;++i) for(int j=1;j<=2;++j) for(int k=1;k<=2;++k) {
    		g[i][j]+=g2[i][k]*g2[k][j]%p;
    		if(g[i][j]>=p) g[i][j]-=p;
    	}
    }
    
    void qpz(ll k) {
    	f[1]=f[2]=1; g[1][1]=0;
    	g[1][2]=g[2][1]=g[2][2]=1;
    	while(k) {
    		if(k&1) cf1();
    		cf2(); k>>=1;
    	}
    }
    
    ll qp(ll x,ll k) {
    	ll rs=1;
    	while(k) {
    		if(k&1) rs=rs*x%p;
    		k>>=1; x=x*x%p;
    	}
    	return rs;
    }
    
    void exgcd(ll a,ll b,ll &x,ll &y) {
    	if(!b) {
    		x=1; y=0;
    		return;
    	}
    	exgcd(b,a%b,y,x);
    	y-=(a/b)*x;
    }
    
    ll get_ans(ll r,ll x,ll b) {
    	if(r<0) return 0;
    	ll rs=r/b;
    	if(r%b>=x) rs++;
    	return rs;
    }
    
    int main() {
    	T=read();ll x,y,a,b,c,o,l,r,w;
    	while(T--) {
    		w=read(); l=read(); r=read();
    		n=read(); p=read(); m=read();
    		qpz(n-3);
    		a=f[2]; b=p; c=(m%p-w%p*f[1]%p+p)%p;//
    		if(c%(o=gcd(a,b))) {
    			printf("0
    "); continue;
    		}
    		a/=o; b/=o; c/=o;
    		exgcd(a,b,x,y); x*=c;
    		x%=b; if(x<0) x+=b;
    		printf("%lld
    ",get_ans(r,x,b)-get_ans(l-1,x,b));
    	}
    	return 0;
    }
    /*
    1
    692858490132927148 33 93 11 90 52
    */
    
  • 相关阅读:
    洛谷P2770 航空路线问题 最小费用流
    洛谷P2766 最长不下降子序列问题 网络流_DP
    洛谷P2763 试题库问题 最大流
    洛谷P2756 飞行员配对方案问题 网络流_二分图
    洛谷P2045 方格取数加强版 最小费用流
    洛谷P1231 教辅的组成 网络流
    LA3231 Fair Share 二分_网络流
    [CTSC1999]家园 分层图网络流_并查集
    力扣题目汇总(丑数,重复N的元素,求众数)
    力扣题目汇总(最长连续递增序列,旋转图像(中等),宝石与石头)
  • 原文地址:https://www.cnblogs.com/Serene-shixinyi/p/8111242.html
Copyright © 2011-2022 走看看