51nod 1354 选数字

来源:互联网 发布:一拍两散 罪人 知乎 编辑:程序博客网 时间:2024/05/22 15:23

1354 选数字

看到题目后直接就01背包,只考虑到排除乘积大于K的….直接在测试运行处就TLE了…
思考一番之后,毫无耐心地查看了官方解题报告。。至于离散化之类的麻烦自然是率先忽略了,只注意到“不是K的约数即可排除”,毕竟就加个判断。
1、n个数里只要不是K的约数即可排除
2、相乘过程中乘积若不是K的约数也可忽略

AC代码:

#include<iostream>#include<stdio.h>#include<map>using namespace std;typedef long long ll;const int MOD = 1e9 + 7;typedef map<ll,int> M;M m;int main(){    int T,n,k,tmp;    cin>>T;    while(T--){        m.clear();        cin>>n>>k;        m[0]++;        while(n--){            scanf("%d",&tmp);            if(k%tmp)continue;            for(M::reverse_iterator it=m.rbegin();it!=m.rend();++it){                ll mu = tmp;                if(it->first>0)mu*=it->first;                if(mu<=k&&k%mu==0) m[mu]=(m[mu]+it->second)%MOD;            }        }        cout<<m[k]<<endl;    }    return 0;}
0 0
原创粉丝点击