NC230081. Magic Gems
描述
输入描述
输入包含两个数字
输出描述
输出能使宝石占据恰好 体积的方案数。因为方案数实在太大了,请输出方案数 后的结果。
示例1
输入:
4 2
输出:
5
说明:
该样例中一颗魔法宝石可以分解得到两颗普通宝石,我们的目标是拿到 颗魔法宝石。示例2
输入:
3 2
输出:
3
C++ 解法, 执行用时: 603ms, 内存消耗: 732K, 提交时间: 2022-03-12 11:32:08
#include<bits/stdc++.h> using namespace std; int m, mo=1e9+7; long long n, f[105][105], a[105][105]; void mul(long long a[105][105], long long b[105][105]){ long long c[105][105]={0}; for(int i=1; i<=m; i++){ for(int j=1; j<=m; j++){ for(int k=1; k<=m; k++){ c[i][j]+=a[i][k]*b[k][j]%mo; } c[i][j]%=mo; } } memcpy(b, c, sizeof(c)); } int main(){ scanf("%lld%d", &n, &m); if(n<m){ printf("1"); return 0; } for(int i=2; i<=m; i++) f[i][1]=a[i][i-1]=1; f[1][1]=2, a[1][1]=a[1][m]=1, n-=m; while(n){ if(n&1) mul(a, f); mul(a, a), n>>=1; } printf("%lld", f[1][1]); return 0; }