-----------------------------------------------------------------------------------------------------------------------------------------------------
内网题题面
题目描述
烦神看上了一个妹子,烦神想找她约会,可是妹子出了一道数学题来考验烦神,烦神只有做对了,妹子才会跟他去约会,题目是这样的:
给出两个正整数A和B,要求求出斐波那契数列的第A项和第B项的最大公约数,结果对19990208取模(烦神约的妹子的生日)。
烦神当然可以秒杀啦,但是他没有时间做,于是他把这个问题留给了你们,他还要节省下时间去约下一个妹子,你能帮帮他吗?
输入
第一行一个正整数T,表示有T组数据,
接下来T行,每行两个正整数A和B。
输出
输出有T行,第 i 行对应第 i 组数据的答案.
样例输入
2
1 1
36 48
样例输出
1
144
提示
0 < A, B <= 10^9.
1 <= T <= 100000.
-----------------------------------------------------------------------------------------------------------------------------------------------------
有一个很有意思的点
gcd(F[n],F[m])=F[gcd(n,m)]
于是再+矩阵快速幂就好了
#include<bits/stdc++.h> #define il inline #define ll long long #define mem(p) memset(&p,0,sizeof(p)) using namespace std; const ll mod=1e8; ll n,m; struct mat{ll a[3][3],r,c;}; il mat mul(mat x,mat y) { mat p; mem(p); for(int i=0;i<x.r;i++) for(int j=0;j<y.c;j++) for(int k=0;k<x.c;k++) p.a[i][j]=(p.a[i][j]+x.a[i][k]*y.a[k][j])%mod; p.r=x.r,p.c=y.c; return p; } il void fast(ll k) { mat p,ans; mem(p),mem(ans); p.r=p.c=2; p.a[0][0]=p.a[0][1]=p.a[1][0]=1; ans.r=1,ans.c=2; ans.a[0][0]=ans.a[0][1]=1; while(k) { if(k&1)ans=mul(ans,p); p=mul(p,p); k>>=1; } cout<<ans.a[0][0]; } il ll gcd(ll a,ll b){return b?gcd(b,a%b):a;} int main() { ios::sync_with_stdio(0); cin>>n>>m; n=gcd(n,m); if(n<=2)cout<<1; else fast(n-2); return 0; }
#include<cstdio> #include<algorithm> #include<cstring> #define ll long long using namespace std; const ll mod = 19990208; ll u,f[100005]; struct mat { ll m[4][4],l,r; }; inline mat mul(mat x,mat y) { mat p; memset(&p,0,sizeof(p)); for(int i = 1;i <= x.l;i++) for(int j = 1;j <= y.r;j++) for(int k = 1;k <= x.r;k++) p.m[i][j] = (p.m[i][j] + x.m[i][k] *y.m[k][j]%mod)% mod; p.l = x.l,p.r = y.r; return p; } void fast(ll k) { mat p,ans; memset(&p,0,sizeof(p)); memset(&ans,0,sizeof(ans)); p.m[1][1] = p.m[1][2] = p.m[2][1] = 1; p.l = 2;p.r = 2; ans.m[1][1] = ans.m[1][2] = 1; ans.l = 1,ans.r = 2; while(k) { if(k & 1) ans = mul(ans,p); p = mul(p,p); k >>= 1; } printf("%lld ",ans.m[1][1]); } int main() { int t; scanf("%d",&t); ll a,b,maxn = -10; f[1] = f[2] = 1; for(int i = 1;i <= t;i++) { scanf("%lld%lld",&a,&b); u = __gcd(a,b); if(u <= 2) printf("1 "); else fast(u - 2); } return 0; }
emm...
两次都因为struct结构体后面忘加“;”而gg
好在
还是一次a了