#include #include #include #include #define rep(i,a,b) for(int i=(a);i<(b);i++) #define rrep(i,a,b) for(int i=(b)-1;i>=(a);i--) #define all(x) begin(x),end(x) #define sz(x) (int)(x).size() using namespace std; using namespace atcoder; using ll=long long; using ld=long double; using vll=vector; using vvll=vector; using vi=vector; using vvi=vector; using pll=pair; using pi=pair; // using mint=modint998244353; using mint=modint1000000007; // using mint2=static_modint<2>; // using BoostPoint=boost::polygon::point_data; // using Voronoi=boost::polygon::voronoi_diagram; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N; ll p2; cin>>N>>p2; if(N==1){ cout<<0<<'\n'; return 0; } mint p=p2,s=1,diag=1; vectora(N+1); a[1]=0,a[2]=1; rep(n,3,N+1){ a[n]=p*a[n-1]+a[n-2]; s+=a[n]; diag+=a[n]*a[n]; } mint ans=(s*s+diag)/2; cout<