#include <bits/stdc++.h> using namespace std; long long n, k; long long gcd(long long a,long long b) { long long r; while(b>0) { r=a%b; a=b; b=r; } return a; } void dfs(long long x, long long& sum, long long& cnt) { if (x > n) { if (sum > k) cnt++; } else { for (int i = 10; i > 0; i--) { sum += i; dfs(x + 1, sum, cnt); sum -= i; } } } int main() { long long wtf=1, cnt = 0, sum = 0; cin>>n>>k; dfs(1,sum,cnt); for(int i=1; i<=n; i++) { wtf*=10; } if(cnt == 0) { cout << "0" << endl; } else if(cnt == wtf) { cout << "1" << endl; } else { long long g=gcd(cnt, wtf); cout << cnt / g << "/" << wtf/ g << endl; } return 0; }优化此代码
时间: 2024-01-20 12:02:46 浏览: 69
这段代码是一个计算1~n位数字每个数位为1~9的数字之和大于k的数字个数的程序,可以使用一些技巧进行优化。
1. 将long long改为int类型
这段代码中的n和k都是int类型,可以将gcd函数中的参数也改为int类型,这样可以提高程序的运行效率。
2. 将递归函数dfs改为循环
递归函数的调用会增加程序的运行时间,可以考虑使用循环来代替递归。将dfs函数中的递归改为循环,可以提高程序的运行效率。
3. 记忆化搜索
在dfs函数中,每次计算都是从头开始,可以将之前计算过的结果记录下来,下次计算时可以直接使用,这样可以避免重复计算。
4. 去掉不必要的计算
在for循环中,数字从大到小循环,当数字为10时,可以直接计算n位数字每个数位都为9的数字个数,然后直接退出循环,不必再进行计算。
5. 使用long long乘法的快速幂算法
在for循环中,计算wtf的值时,可以使用快速幂算法来加速计算。
下面是优化后的代码:
```c++
#include <bits/stdc++.h>
using namespace std;
int n, k;
int cnt = 0, sum = 0;
int f[11][101][901];
int gcd(int a, int b) {
int r;
while (b > 0) {
r = a % b;
a = b;
b = r;
}
return a;
}
int main() {
cin >> n >> k;
f[0][0][0] = 1; //初始化
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= i * 9; j++) {
for (int l = 0; l <= k; l++) {
for (int m = 0; m <= min(j, 9); m++) {
f[i][j][l] += f[i - 1][j - m][l - m];
}
}
}
}
for (int i = 1; i <= n; i++) {
cnt += f[i][i * 9][k];
}
int wtf = pow(10, n);
int g = gcd(cnt, wtf);
if (cnt == 0) {
cout << "0" << endl;
} else if (cnt == wtf) {
cout << "1" << endl;
} else {
cout << cnt / g << "/" << wtf / g << endl;
}
return 0;
}
```
阅读全文