• 两道 杂题


    1、2022

    将 2022 拆分成 10 个互不相同的正整数之和, 总共有多少种拆分方法?

    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. #define int long long
    4. #define fp(i,a,b) for(int i=a;i<=b;++i)
    5. const int N=1e6+10;
    6. const int mod=1e9+7;
    7. const double eps=1e-5;
    8. typedef double db;
    9. int dp[2050][12][2050];
    10. signed main()
    11. {
    12. for(int i=0;i<=2022;i++)
    13. {
    14. dp[i][0][0]=1;
    15. }
    16. for(int i=1;i<=2022;i++)
    17. {
    18. for(int j=1;j<=10;j++)
    19. {
    20. for(int k=1;k<=2022;k++)
    21. {
    22. dp[i][j][k]=dp[i-1][j][k];
    23. if(k>=i)dp[i][j][k]+=dp[i-1][j-1][k-i];
    24. }
    25. }
    26. }
    27. cout<<dp[2022][10][2022]<<"\n";
    28. return 0;
    29. }

    dp[i][j][k]      前i个物品里选j个体积之和是k       

    不选第i个 dp[i][j][k]=dp[i-1][j][k];

    选第i个dp[i][j][k]+=dp[i-1][j-1][k-i];

    降空间

    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. #define int long long
    4. #define fp(i,a,b) for(int i=a;i<=b;++i)
    5. const int N=1e6+10;
    6. const int mod=1e9+7;
    7. const double eps=1e-5;
    8. typedef double db;
    9. int dp[12][2050];
    10. signed main()
    11. {
    12. dp[0][0]=1;
    13. for(int i=1;i<=2022;i++)
    14. {
    15. for(int j=10;j>=1;j--)
    16. {
    17. for(int k=1;k<=2022;k++)
    18. {
    19. if(k>=i)dp[j][k]+=dp[j-1][k-i];
    20. }
    21. }
    22. }
    23. cout<<dp[10][2022]<<"\n";
    24. return 0;
    25. }

    类似于01背包

    2、取模

    给定 n, m,问是否存在两个不同的数 x,y 使得 1≤x

    记 L=lcm(1,2,⋯,m)。如果n到不了L-1  根据鸽巢原理  必然是YES

    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. #define int long long
    4. #define fp(i,a,b) for(int i=a;i<=b;++i)
    5. const int N=1e6+10;
    6. const int mod=1e9+7;
    7. const double eps=1e-5;
    8. typedef double db;
    9. int t;
    10. int n,m;
    11. int check(int n,int m){
    12. set<int>a;
    13. for(int i=1;i<=m;i++){
    14. if(a.count(n%i)!=0)return 1;
    15. a.insert(n%i);
    16. }
    17. return 0;
    18. }
    19. signed main()
    20. {
    21. cin>>t;
    22. while(t--)
    23. {
    24. cin>>n>>m;
    25. if(m>=30)
    26. {
    27. cout<<"Yes\n";
    28. }
    29. else
    30. {
    31. if(check(n,m))cout<<"Yes\n";
    32. else cout<<"No\n";
    33. }
    34. }
    35. return 0;
    36. }

    复杂度最坏也有O(nt)

  • 相关阅读:
    java物业服务信息系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
    前端技能树初体验
    Android Banner - ViewPager 02
    C++基本语法【恩培学习笔记(一)】
    【Leetcode】2684. 矩阵中移动的最大次数
    014、检查点
    梯度下降(机器学习)
    【SpringBoot】SpringBoot+SpringSecurity+CAS实现单点登录
    linux-4.19 内存
    一场深刻的开源聚会:KCC@北京 9.2 活动回顾
  • 原文地址:https://blog.csdn.net/m0_61949623/article/details/133465577