zoj 1136 Multiple

来源:互联网 发布:成本核算软件sap 编辑:程序博客网 时间:2024/06/06 01:26

这题由于最后结果可能会比较大,不能直接用int 存储,有一个小小的数学知识:

若 (x*10+c)%n==0, 则 ((x%n)*10+c)==0, 这个证明的话把x写成 a*n+b在纸上算一算就出来了

#include <stdio.h>#include <cmath>#include <algorithm>#include <cstring>#include <vector> #include <functional>#include <queue>using namespace std;vector<int> num, re;typedef struct{int x, va, head;}que;que q[5001];bool cmp(int a, int b){return a<b;}int main(){int n, m, t, i, j, x, b[5001];while(scanf("%d%d", &n,  &m)!=EOF){num.clear();memset(b, 0, sizeof(b));re.clear();for(i=0; i<m; i++){scanf("%d", &t);num.push_back(t);}if(n==0){printf("0\n");continue;}sort(num.begin(), num.end(), cmp);int head=0, end=0;q[0].x=0; q[0].va=0; q[0].head=0;while(head<=end){for(i=0; i<m; i++){if(head==0&&num[i]==0) continue;x=(q[head].x*10+num[i])%n;if(!b[x]){end++;q[end].x=x;q[end].head=head;q[end].va=num[i];b[x]=1;if(x==0){while(end!=0){re.push_back(q[end].va);end=q[end].head;}for(j=re.size()-1; j>=0; j--)printf("%d", re[j]);printf("\n");goto hhh;}}}head++;}printf("0\n");hhh:;}return 0;}


0 0
原创粉丝点击