| √ | 1537 | 序列的混乱程度 | 水 | 368 | 637 |
| √ | 1538 | 随机数 | 水 | 264 | 357 |
| √··· | 1539 | 完美序列 | DP | 13 | 62 |
| √··· | 1540 | 第k大数 | 二分/经典 | 54 | 446 |
| √ | 1541 | 选房子 | 水 | 305 | 341 |
| 1542 | Game | ? | 3 | 20 | |
| √ | 1543 | Numbers | 二进制/因子 | 76 | 334 |
| √··· | 1544 | Counting Words | stringstream流类输入/字符串操作 | 250 | 465 |
【1544分析】:(参考https://zhuanlan.zhihu.com/p/26063938)
- 我们的思想是每次读取一行,然后再扫描该行的字符,同时计算结果。如果使用getchar( )边读边算,虽然代码较短,但容易写错,并且相对较难理解;
- 可以把string作为流进行读写,定义在sstream头文件中。虽然string和sstream都很方便,但string很慢,sstream更慢,应谨慎使用
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 2000 + 5; const ll MOD = 1e9 + 7; ll dp[maxn][maxn]; ll dfs(int x,int k) { if(k==1||x==1) return 1; if(dp[x][k]!=-1) return dp[x][k]; ll rtn = 0; int lim = sqrt(x); for(int i=1;i<=lim;i++) if(x%i==0){ rtn += dfs(i, k-1); if(i!=x/i) rtn += dfs(x/i,k-1); } return dp[x][k] = rtn%MOD; } int main() { int n, l, T; scanf("%d", &T); memset(dp,-1,sizeof(dp)); while(T--) { scanf("%d%d",&n,&l); ll ans = 0; for(int i=1;i<=n;i++) (ans += dfs(i,l)) %= MOD; cout << ans << endl; } return 0; }