推下公式 a[i] = a[i-1] + a[i-2] +2
#include<stdio.h> #include<string.h> long long a[5000006]; int main() { long long n; scanf("%lld",&n); a[1]=1;a[2]=3;a[3]=6; for(int i=4;i<=n;i++) a[i]=(a[i-1]+a[i-2]+2)%10000000007; printf("%lld",a[n]); return 0; }
B 略
找到最大公约数 然后能被最大公约数整除的必然是 a b 的约数
#include<bits/stdc++.h> using namespace std; #define LL long long LL gcd(LL a,LL b){ return b?gcd(b,a%b):a; } int main(){ LL a,b; cin>>a>>b; LL g=gcd(a,b); vector<LL> q; for(LL i=1;i*i<=g;i++){ if(g%i==0){ q.push_back(i); if(i*i!=g) q.push_back(g/i); } } sort(q.begin(),q.end()); for(int i=0;i<q.size();++i){ cout<<q[i]<<' '; } return 0; }