• UVA11754


    Hooray!  Agent Bauer has shot the terrorists, blown upthe bad guy base, saved the hostages, exposed the moles in the government,prevented an environmental catastrophe, and found homes for three orphanedkittens, all in the span of 19 consecutive hours.  But now, he only has 5 hours remaining todeal with his final challenge: an activated nuclear bomb protected by asecurity code.  Can you help him figureout the code and deactivate it?  Eventsoccur in real time.

    The governmenthackers at CTU (Counter-Terrorist Unit) have learned some things about thecode, but they still haven't quite solved it.They know it's a single, strictly positive, integer.  They also know several clues of the form "whendivided by X, the remainder is one of {Y1, Y2, Y3, ...,Yk}".There are multiple solutions to these clues, but the code is likely tobe one of the smallest ones.  So they'dlike you to print out the first few solutions, in increasing order.

    The world iscounting on you!

    Input

    Input consistsof several test cases.  Each test casestarts with a line containing C, the number of clues (1 <= C <= 9), andS, the number of desired solutions (1 <= S <= 10).  The next C lines each start with two integersX (2 <= X) and k (1 <= k <= 100), followed by the k distinct integersY1, Y2, ..., Yk (0 <= Y1,Y2, ..., Yk < X).

    You may assumethat the Xs in each test case are pairwise relativelyprime (ie, they have no common factor except 1).  Also, the product of the Xs will fit into a32-bit integer.

    The last testcase is followed by a line containing two zeros.

    Output

    For each testcase, output S lines containing the S smallest positive solutions to the clues,in increasing order.

    Print a blankline after the output for each test case.

    Sample Input                              

    Sample Output

     

    3 2

    2 1 1

    5 2 0 3

    3 2 1 2

    0 0

    5

    13

     

    思路:中国剩余定理+暴力;

    首先我们肯定会想到dfs暴力枚举,这种情况只有当所有k的乘积很小的情况下才行,这个时候我们采取dfs+中国剩余定理;当k的乘积很大的情况下,

    考虑选择一个K/X最小的条件,然后枚举所有符合这个条件的数n,即 tX+Yi ,t=0,1,2.... 然后依次判断这个n是否符合其它所有条件,因为这个时候x的增量很大。

      1 #include <cstdio>
      2 #include <iostream>
      3 #include <cstring>
      4 #include <algorithm>
      5 #include <map>
      6 #include <vector>
      7 #include <set>
      8 typedef long long LL;
      9 using namespace std;
     10 typedef struct node
     11 {
     12     int x;
     13     int y;
     14     int bns[105];
     15     double b;
     16 } ss;
     17 set<LL>ask;
     18 set<LL>::iterator it;
     19 set<int>val[20];
     20 ss ans[20];
     21 int a[20];
     22 void  dfs(int x,int y);
     23 LL china(int x);
     24 pair<LL,LL>ex_gcd(LL n,LL m);
     25 void slove__x(int n,int id,int m);
     26 LL R;
     27 bool cmp(node p,node q)
     28 {
     29     return p.b < q.b;
     30 }
     31 int main(void)
     32 {
     33     int n,m;
     34     while(scanf("%d %d",&n,&m)!=EOF)
     35     {
     36         if(n==0||m==0)break;
     37         int i,j;
     38         int id = 0;
     39         LL um = 1;
     40         for(i = 0; i < n; i++)
     41         {
     42             scanf("%d",&ans[i].x);
     43             scanf("%d",&ans[i].y);
     44             for(j = 0; j < ans[i].y; j++)
     45             {
     46                 scanf("%d",&ans[i].bns[j]);
     47             }
     48             sort(ans[i].bns,ans[i].bns+ans[i].y);
     49             if(ans[id].x*ans[i].y<ans[i].x*ans[id].y)id=i;
     50             um *= ans[i].y;
     51             ans[id].b = 1.0*ans[i].y/ans[i].x;
     52         }
     53         sort(ans,ans+n,cmp);
     54         if(um <= 10000)
     55         {
     56             ask.clear();
     57             R = 1;
     58             for(i = 0 ; i < n; i++)
     59             {
     60                 R *= ans[i].x;
     61             }
     62             dfs(0,n);
     63             int cn = 0;
     64             for(i = 0 ; m!=0; i++)
     65             {
     66                 for(it = ask.begin(); it!=ask.end(); it++)
     67                 {
     68                     LL tt = *it + i*R;
     69                     if(tt > 0)
     70                     {
     71                         m--;
     72                         printf("%lld
    ",tt);
     73                         if(m==0)
     74                             break;
     75                     }
     76                 }
     77             }
     78         }
     79         else
     80         {
     81             slove__x(n,id,m);
     82         }
     83         printf("
    ");
     84     }
     85     return 0;
     86 }
     87 void dfs(int x,int y)
     88 {
     89     if(x == y)
     90     {
     91         ask.insert(china(y));
     92         return ;
     93     }
     94     else for(int i = 0; i < ans[x].y; i++)
     95         {
     96             a[x] = ans[x].bns[i];
     97             dfs(x+1,y);
     98         }
     99 }
    100 LL china(int x)
    101 {
    102     int i,j;
    103     LL sum = 0;
    104     LL ac = 1;
    105     ac = R;
    106     for(i = 0; i < x; i++)
    107     {
    108         LL ak = ac/ans[i].x;
    109         pair<LL,LL>cc = ex_gcd(ak,ans[i].x);
    110         LL aa = cc.first;
    111         aa = (aa%ans[i].x + ans[i].x)%ans[i].x;
    112         sum = sum + ((aa*ak%ac)*a[i])%ac;
    113         sum %= ac;
    114         sum += ac;
    115         sum %= ac;
    116     }
    117     return sum;
    118 }
    119 pair<LL,LL>ex_gcd(LL n,LL m)
    120 {
    121     if(m == 0)
    122         return make_pair(1,0);
    123     else
    124     {
    125         pair<LL,LL>ac = ex_gcd(m,n%m);
    126         return make_pair(ac.second,ac.first-(n/m)*ac.second);
    127     }
    128 }
    129 void slove__x(int n,int id,int m)
    130 {
    131     int i,j;
    132     for(i = 0; i < n; i++)
    133         val[i].clear();
    134     for(i = 0; i < n; i++)
    135     {
    136         for(j = 0; j < ans[i].y; j++)
    137         {
    138             val[i].insert(ans[i].bns[j]);
    139         }
    140     }
    141     for(i = 0; m != 0; i++)
    142     {
    143         for(j = 0; j < ans[id].y; j++)
    144         {
    145             LL ak = (LL)i*(LL)ans[id].x + ans[id].bns[j];
    146             if(ak > 0)
    147             {
    148                 int flag = 0;
    149                 for(int c = 0; c < n; c++)
    150                 {
    151                     if(c!=id)
    152                     {
    153                         if(!val[c].count(ak%ans[c].x))
    154                         {
    155                             flag = 1;
    156                             break;
    157                         }
    158                     }
    159                 }
    160                 if(!flag)
    161                 {
    162                     printf("%lld
    ",ak);
    163                     m--;
    164                 }
    165                 if(m==0)break;
    166             }
    167         }
    168     }
    169 }
    油!油!you@
  • 相关阅读:
    Oracle.ManagedDataAccess.dll 连接Oracle数据库不需要安装客户端
    Oracle.DataAccess.Client.OracleCommand”的类型初始值设定项引发异常
    SQLAchemy
    MySQL 索引详解大全
    不用任何图片,只用简单的css写出唯美的钟表,就问你行吗?
    Ajax详解
    Mysql自定义函数
    MySQL目录
    Mysql函数集合
    MySQL之扩展(触发器,存储过程等)
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5803576.html
Copyright © 2020-2023  润新知