zoukankan      html  css  js  c++  java
  • SPOJ AMR10I 递归

    DES :给你n 块石头。不会超过70。把它们分成n堆。每堆里的石头数做积。问共有多少个数。最终的结果除了1之外都能分解成素数相乘或者素数相乘再乘1.所以可以找到所有不超过70的素数然后进行深搜。

    感觉深搜好难好难好难....

    #include<stdio.h>
    #include<iostream>
    #include<set>
    using namespace std;
    
    int prime[21] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73};
    set<long long>s;
    int p;
    
    void dfs(int x, int n, long long ji) // 要不要第x个数。当前值是多少。当前乘积是多少/
    {
        s.insert(ji);
        if (prime[x] > n) return;
        dfs(x+1, n, ji); // 不取第x个素数
        dfs(x, n-prime[x], ji*prime[x]%p); // 取第x个数
    }
    
    int main()
    {
        int t;
        cin >> t;
        while(t--)
        {
            int n;
            cin >> n >> p;
            s.clear();
            dfs(0, n, 1);
            cout << s.size() << endl;
        }
        return 0;
    }
    L哦哦K
  • 相关阅读:
    Kakuro Extension HDU
    CodeForces
    HDU
    2019牛客暑期多校训练营(第二场)F.Partition problem
    UVA
    团队冲刺6
    团队冲刺4
    团队冲刺3
    团队冲刺2
    团队冲刺1
  • 原文地址:https://www.cnblogs.com/icode-girl/p/4691619.html
Copyright © 2011-2022 走看看