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 \times F_{k-2} + A_2 \times F_{k-1}$
那么我们需要求满足$A_1 \times F_{k-2} + A_2 \times 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\n"); continue; } a/=o; b/=o; c/=o; exgcd(a,b,x,y); x*=c; x%=b; if(x<0) x+=b; printf("%lld\n",get_ans(r,x,b)-get_ans(l-1,x,b)); } return 0; } /* 1 692858490132927148 33 93 11 90 52 */
弱者就是会被欺负呀