SPOJ_AMR10I_Dividing Stones(DFS)

来源:互联网 发布:淘宝有多少分可以扣 编辑:程序博客网 时间:2024/06/14 15:52

题型:搜索


题意:

       对N进行整数拆分,每种拆分方法求积得到一个值,问不同的值有多少。

例如

       n=5:

                 1=1*1*1*1*1
                 2=2*1*1*1
                 3=3*1*1
                 4=4*1
                 5=5
                 6=2*3

             ans = 6


分析:

       问不同的积的个数,由于整数又可以用素数之积来表示,所以即使不用素数,最后得出的积也可以由素数之积得出,因此可以用70以内的素数已经搜索,而且整数可以用素数之和来表示,所以dfs时,用选与不选当前这个素数来深搜,若当前的n小于当前的素数值,则return


代码:

#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<set>#define LL long longusing namespace std;int pri[] = {2 ,3 ,5 ,7 ,11 ,13 ,17 ,19 ,23 ,29 ,31 ,37 ,41 ,43 ,47 ,53 ,59 ,61 ,67 ,71};///20int n,p;set<LL> ans;void dfs(int pos,int now,LL mul){    ans.insert(mul);    if(now < pri[pos]) return;    ///用pri[pos]    dfs(pos,now-pri[pos],mul*pri[pos]%p);    ///不用pri[pos]    dfs(pos+1,now,mul);}int main() {    int _;    scanf("%d",&_);    while(_--){        scanf("%d%d",&n,&p);        ans.clear();        dfs(0,n,1);        printf("%d\n",ans.size());    }    return 0;}/**2 ,3 ,5 ,7 ,11 ,13 ,17 ,19 ,23 ,29 ,31 ,37 ,41 ,43 ,47 ,53 ,59 ,61 ,67 ,71*/



0 0
原创粉丝点击