题意概述:

有一个正整数$N$满足$C$个条件,每个条件都形如“它除以$X$的余数在集合$\{Y_1, Y_2, ..., Y_k\}$中”,所有条件中的$X$两两互质,

你的任务是找出最小的S个解。

数据范围:

$1\leq C\leq9, 1 \leq S \leq 10, X \geq 2, 1 \leq k \leq 100, 0 \leq Y_i \leq X$

分析:

如果每个集合元素个数为1,那么我们直接使用中国剩余定理求解即可。

因此我们想到枚举余数,但是余数的组合最多会有$100^9$种可能,太多了。我们发现加入$k$的积不大的话,使用这种方法是可行的。比如

我们假设每个集合元素都不超过5。而当集合元素增加时,由于可行解是在模$M = \prod X_i$下的在枚举复杂度提高的同时也意味着可行解在

数轴上变得稠密,这意味着我们可以通过从小到大枚举答案并判定的方法解决。为了加快此过程,我们希望不可行的枚举尽快被否定,因此我们

希望首先使用$k$较小并且$X$较大的条件判定,因为这个条件是更强的,于是考虑按照$\frac{k}{X}$从小到大的顺序检验答案$i$是否满足当前

条件。由此问题便可解决。

 #include <algorithm>
 #include <cstdio>
 #include <cstring>
 #include <string>
 #include <queue>
 #include <map>
 #include <set>
 #include <ctime>
 #include <cmath>
 #include <iostream>
 #include <assert.h>
 #define pi acos(-1.)
 using namespace std;
 typedef long long ll;
 const int int_inf = 0x3f3f3f3f;
 const ll ll_inf = 0x3f3f3f3f3f3f3f3f;
 ) - );
 ;
 const double double_inf = 1e30;
 typedef unsigned long long ul;
 #pragma comment(linker, "/STACK:102400000,102400000")
 #define max(a, b) ((a) > (b) ? (a) : (b))
 #define min(a, b) ((a) < (b) ? (a) : (b))
 #define mp make_pair
 #define st first
 #define nd second
 #define keyn (root->ch[1]->ch[0])
 #define lson (u << 1)
 #define rson (u << 1 | 1)
 #define pii pair<int, int>
 #define pll pair<ll, ll>
 #define pb push_back
 #define type(x) __typeof(x.begin())
 #define foreach(i, j) for(type(j)i = j.begin(); i != j.end(); i++)
 #define FOR(i, s, t) for(int i = (s); i <= (t); i++)
 #define ROF(i, t, s) for(int i = (t); i >= (s); i--)
 #define dbg(x) cout << x << endl
 #define dbg2(x, y) cout << x << " " << y << endl
 #define clr(x, i) memset(x, (i), sizeof(x))
 #define maximize(x, y) x = max((x), (y))
 #define minimize(x, y) x = min((x), (y))
 #define low_bit(x) ((x) & (-x))

 inline int readint(){
     int x;
     scanf("%d", &x);
     return x;
 }

 inline int readstr(char *s){
     scanf("%s", s);
     return strlen(s);
 }

 class cmpt{
 public:
     bool operator () (const int &x, const int &y) const{
         return x > y;
     }
 };

 int Rand(int x, int o){
     //if o set, return [1, x], else return [0, x - 1]
     ;
     int tem = (int)((double)rand() / RAND_MAX * x) % x;
      : tem;
 }

 void data_gen(){
     srand(time());
     freopen("in.txt", "w", stdout);
     ;
     printf("%d\n", times);
     while(times--){
         , ), a = Rand(, ), c = Rand(, );
         ), d = Rand(r, );
         , ), n = Rand(m, );
         printf("%d %d %d %d %d %d %d\n", n, m, a, b, c, d, r);
     }
 }

 struct cmpx{
     bool operator () (int x, int y) { return x > y; }
 };
 ;
 , , , };
 , , -, };
 //-------------------------------------------------------------------------
 int C, S;
 ll mt[][];
 ll X[], k[];
 ll ans[];
 ll buf[];
 ll w[], _w[];
 ll M;
 ];
 pair<pll, ];
 const int lim = 1e5;

 void egcd(ll a, ll b, ll &d, ll &x, ll &y){
     if(!b){
         d = a, x = , y = ;
         return;
     }
     egcd(b, a % b, d, x, y);
     ll x1 = x, y1 = y;
     x = y1, y = x1 - a / b * y1;
 }

 void dfs(int pos){
     ){
         ll tem = ;
         FOR(i, , C) tem += buf[i] * w[i] % M * _w[i] % M, tem %= M;
         if(!tem) tem = M;
         FOR(i, , S - ) ans[i + S] = tem + M * i;
         sort(ans, ans +  * S);
         return;
     }
     FOR(i, , k[pos]){
         buf[pos] = mt[pos][i];
         dfs( + pos);
     }
 }

 bool cmp(pair<pll, int> x, pair<pll, int> y){
     return x.st.st * y.st.nd < x.st.nd * y.st.st;
 }

 void enu_solve(){
     FOR(i, , C) _buf[i] = mp(mp(k[i], X[i]), i);
     sort(_buf + , _buf + C + );
     FOR(i, , C) id[i] = _buf[i].nd;
     ;
     ;
     while(cnt < S){
         ;
         FOR(i, , C){
             int j = id[i];
             int tem = bg % X[j];
             int sz = k[j];
             ;
             FOR(u, , sz) ; break; }
             ; break; }
         }
         if(ok1) ans[cnt++] = bg;
         bg++;
     }
 }

 void crt_solve(){
     M = ;
     FOR(i, , C) M *= X[i];
     FOR(i, , C) w[i] = M / X[i] % M;
     FOR(i, , C){
         ll d, x, y;
         egcd(w[i], X[i], d, x, y);
         _w[i] = (x % X[i] + X[i]) % X[i];
     }
     clr(ans, ll_inf);
     dfs();
 }

 void solve(){
     ll num = ;
     ;
     FOR(i, , C){
         num *= k[i];
         if(num > lim){
             ok = ;
             break;
         }
     }
     if(ok) crt_solve();
     else enu_solve();
 }

 //-------------------------------------------------------------------------
 int main(){
     //data_gen(); return 0;
     //C(); return 0;
     debug = ;
     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
     if(debug) freopen("in.txt", "r", stdin);
     //freopen("out.txt", "w", stdout);
     while(~scanf("%d%d", &C, &S) && C){
         FOR(i, , C){
             X[i] = readint(), k[i] = readint();
             FOR(j, , k[i]) mt[i][j] = readint();
         }
         solve();
         FOR(i, , S - ) printf("%lld\n", ans[i]);
         printf("\n");
     }
     //////////////////////////////////////////////////////////////////////////////////////////////////////////////
     ;
 }

code:

Uva 11754 Code Feat的更多相关文章

  1. UVA 11754 - Code Feat(数论)

    UVA 11754 - Code Feat 题目链接 题意:给定一个c个x, y1,y2,y3..yk形式,前s小的答案满足s % x在集合y1, y2, y3 ... yk中 思路:LRJ大白例题, ...

  2. UVA 11754 Code Feat (枚举,中国剩余定理)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud C Code Feat   The government hackers at C ...

  3. UVA 11754 Code Feat 中国剩余定理+暴力

    lrj白书例题,真好 #include <stdio.h> #include <iostream> #include <vector> #include <m ...

  4. UVa 11754 (中国剩余定理 枚举) Code Feat

    如果直接枚举的话,枚举量为k1 * k2 *...* kc 根据枚举量的不同,有两种解法. 枚举量不是太大的话,比如不超过1e4,可以枚举每个集合中的余数Yi,然后用中国剩余定理求解.解的个数不够S个 ...

  5. UVA 11754 (暴力+中国剩余定理)

    题目链接: http://www.bnuoj.com/v3/problem_show.php?pid=20172 题目大意:有C个模方程,每个方程可能有k余数,求最小的S个解. 解题思路: 看见模方程 ...

  6. [kuangbin带你飞]专题十四 数论基础

            ID Origin Title   111 / 423 Problem A LightOJ 1370 Bi-shoe and Phi-shoe   21 / 74 Problem B ...

  7. UVa 740 - Baudot Data Communication Code

    称号:目前编码,他们shift键被按下,并提出,对应的两个编码,其中,2相应的编码shift操作. 给你适当的编码值.寻求相应的字符串. 分析:模拟.字符串. 简单题,标记shift的升降分类处理就可 ...

  8. Uva 12436 Rip Van Winkle&amp;#39;s Code

    Rip Van Winkle was fed up with everything except programming. One day he found a problem whichrequir ...

  9. UVa 1593 (水题 STL) Alignment of Code

    话说STL的I/O流用的还真不多,就着这道题熟练一下. 用了两个新函数: cout << std::setw(width[j]);    这个是设置输出宽度的,但是默认是在右侧补充空格 所 ...

随机推荐

  1. Java程序设计之算出一年第多少天

    可以直接拷贝运行. package year; import java.util.Scanner; public class year { public static void main(String ...

  2. [No000050]练习一万小时便能成为天才

    练习一万小时便能成为天才 世界上顶尖的记忆高手都是训练出来的! 加拿大畅销书作家麦尔坎·葛拉威尔在<异数>一书中指出:"人们眼中的天才之所以卓越非凡,并非天资超人一等,而是付出了 ...

  3. Javascript笔记一

    Javascript: ECMAscript :相当于翻译器 翻译电脑于代码  解释器 DOM document object model  文档 对象 模型  --->document  获取 ...

  4. Spring学习2—Spring容器

    一.Spring容器接口关系 容器是Spring框架的核心,Spring容器就是一个巨大的工厂.Spring容器使用Ioc(控制反转(Inversion of Control )管理所有组成应用系统的 ...

  5. 将MyApp.exe和Autorun.lnk添加到NK里,在project.bib文件内加入

    1. 将应用程序和应用程序快捷方式添加到映像里,再将快捷方式添加到StartUp目录下,这样当系统运行后应用程序就能自动运行:2. 直接替换Wince的SHELL,即修改注册表: [HKEY_LOCA ...

  6. android 打开软件出现红框

    android打开软件的时候会出现红框,剑锋之前解了这个问题.fork过来,方便以后查看. 参考链接: http://www.cnblogs.com/zengjfgit/p/5377744.html ...

  7. jquery组件团购倒计时功能

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  8. CMSIS-DAP调试器

    http://www.keil.com/support/man/docs/dapdebug/dapdebug_introduction.htm CMSIS-DAP is the interface f ...

  9. mk文件剖析

    一个Android.mk file用来向编译系统描述你的源代码.具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次.你可以在每一个Android.mk file中定义一个 ...

  10. CASS转ARCGIS

    本文转载千浪兄弟博客 1.先看看这张图:CASS的扩展属性 ("south" (1000 . "310000")) 对应图斑属性编码“310000”,(&quo ...