HDU 5768 - Lucky7

题意:

    给出x, y, m[1...n], a[1..n].
      

    在[x,y]中寻找 p % 7 = 0 且对任意(1<= i <=n) p % m[i] != a[i] 的数字的个数
    
分析:

    可用容斥定理,先在[x,y]找出所有7的倍数,再根据多个模线性方程连立,去掉所有不合法的
      

    因 m[1...n] 互质,故可直接使用中国剩余定理.

    并且需要在其中用 快速加法 防止超 long long

 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <cstdio>
 4 using namespace std;
 5 #define LL long long
 6 const int MAXN = 20;
 7 LL ExtGcd(LL a,LL b,LL &x,LL &y)
 8 {
 9     if (b == 0) {x = 1; y = 0; return a;}
10     LL d = ExtGcd(b, a%b, y, x);
11     y -= a / b * x;
12     return d;
13 }
14 LL Mul(LL a,LL b,LL MOD)
15 {
16     a%=MOD; b%=MOD;
17     LL res = 0;
18     while(b)
19     {
20         if (b&1) res = (res + a) % MOD;
21         a <<= 1; if(a > MOD) a-=MOD;
22         b >>= 1;
23     }
24     return res;
25 }
26 void CRT(LL &ans,LL &M, LL a[],LL m[],int k) //X = a[i] ( mod m[i] )(m[i]两两互质)
27 {                                            //解为 X = ans + M * t (0 <= ans <= M)
28     M = 1, ans = 0;
29     LL x, y, Mi;
30     for (int i = 0; i < k; i++) M *= m[i];
31     for (int i = 0; i < k; i++)
32     {
33         Mi = M / m[i];
34         ExtGcd(m[i], Mi, x, y);
35         ans = (ans + Mul( Mul(y, Mi, M), a[i], M)) % M;
36     }
37     if(ans < 0) ans += M;
38 }
39 int t, n;
40 LL x, y;
41 LL m1[MAXN], a1[MAXN], m[MAXN], a[MAXN];
42 LL Cal(LL m,LL a)
43 {
44     LL x0 = x + m - a;
45     LL y0 = y + m - a;
46     return y0 / m - (x0 - 1) / m;//计算[x,y]中有多少p % m = a
47 }
48 int main()
49 {
50     scanf("%d", &t);
51     for(int tt = 1; tt <= t; tt++)
52     {
53         scanf("%d%lld%lld", &n, &x, &y);
54         for(int i = 0; i < n ; i++)
55             scanf("%lld%lld", &m1[i], &a1[i]);
56         int cnt = 0;
57         LL ans = Cal(7,0);//找出所有7的倍数
58         for (int i = 1; i < (1<<n); i++)//枚举
59         {
60             cnt = 0;
61             for (int j = 0; j < n; j++)
62             {
63                 if (i & (1<<j))
64                 {
65                     m[cnt] = m1[j];
66                     a[cnt] = a1[j];
67                     ++cnt;
68                 }
69             }
70             m[cnt] = 7;
71             a[cnt] = 0;
72             ++cnt;
73             LL M,A;
74             CRT(A, M, a, m, cnt);
75             if (cnt%2) ans += Cal(M, A);//加奇数个,减偶数个
76             else ans -= Cal(M, A);
77         }
78         printf("Case #%d: %lld\n",tt,ans);
79     }
80 } 
时间: 2024-08-06 11:11:38

HDU 5768 - Lucky7的相关文章

【中国剩余定理】【容斥原理】【快速乘法】【数论】HDU 5768 Lucky7

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5768 题目大意: T组数据,求L~R中满足:1.是7的倍数,2.对n个素数有 %pi!=ai  的数的个数. 题目思路: [中国剩余定理][容斥原理][快速乘法][数论] 因为都是素数所以两两互素,满足中国剩余定理的条件. 把7加到素数中,a=0,这样就变成解n+1个同余方程的通解(最小解).之后算L~R中有多少解. 但是由于中国剩余定理的条件是同时成立的,而题目是或的关系,所以要用容斥原理叠加删

HDU 5768 Lucky7(CRT+容斥原理)

[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5768 [题目大意] 求出一个区间内7的倍数中,对于每个ai取模不等于bi的数的个数. [题解] 首先,对于x mod 7=0,和选取的一些x mod ai=bi,我们可以利用CRT解出最小的x值,那么这样子我们就可以对所有的aibi选取方式做容斥,得到x mod 7=0成立且所有x mod ai=bi不成立的x的个数.也就是答案. [代码] #include <cstdio> #include

HDU 5768 Lucky7 (中国剩余定理+容斥)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5768 给你n个同余方程组,然后给你l,r,问你l,r中有多少数%7=0且%ai != bi. 比较明显的中国剩余定理+容斥,容斥的时候每次要加上个(%7=0)这一组. 中间会爆longlong,所以在其中加上个快速乘法(类似矩阵快速幂).因为普通的a*b是直接a个b相加,很可能会爆.但是你可以将b拆分为二进制来加a,这样又快又可以防爆. 1 //#pragma comment(linker, "/S

HDU 5768 Lucky7 (容斥原理 + 中国剩余定理 + 状态压缩 + 带膜乘法)

题意:……应该不用我说了,看起来就很容斥原理,很中国剩余定理…… 方法:因为题目中的n最大是15,使用状态压缩可以将所有的组合都举出来,然后再拆开成数组,进行中国剩余定理的运算,中国剩余定理能够求出同时满足余膜条件的最小整数x,x在(1,M)之间由唯一值,M是各个除数的乘积,所有符合条件的解为ans = x+k*M,可以知道在[1,R]这个区间内,有(M+R-x)/ M个k符合条件,然后在运算中为了防止溢出,所以使用了带膜乘法,就是将乘数转化为二进制,通过位移运算符,在中间过程中不断的取膜(看代

HDU 5768:Lucky7(中国剩余定理 + 容斥原理)

http://acm.hdu.edu.cn/showproblem.php?pid=5768 Lucky7 Problem Description When ?? was born, seven crows flew in and stopped beside him. In its childhood, ?? had been unfortunately fall into the sea. While it was dying, seven dolphins arched its body

hdu 5768(中国剩余定理+容斥)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5768: 题目分析: 因为满足任意一组pi和ai,即可使一个"幸运数"被"污染",我们可以想到通过容斥来处理这个问题.当我们选定了一系列pi和ai后,题意转化为求[x,y]中被7整除余0,且被这一系列pi除余ai的数的个数,可以看成若干个同余方程联立成的一次同余方程组.然后我们就可以很自然而然的想到了中国剩余定理.需要注意的是,在处理中国剩余定理的过程中,可能会发生超出L

HDU 5768 中国剩余定理

题目链接:Lucky7 题意:求在l和r范围内,满足能被7整除,而且不满足任意一组,x mod p[i] = a[i]的数的个数. 思路:容斥定理+中国剩余定理+快速乘法. (奇+ 偶-) #include <stdio.h> #include <string.h> #include <iostream> using namespace std; #define LL long long #define FOR(i, n) for (int i=0; i<n; +

HDU 5768Lucky7(多校第四场)容斥+中国剩余定理(扩展欧几里德求逆元的)+快速乘法

地址:http://acm.hdu.edu.cn/showproblem.php?pid=5768 Lucky7 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 754    Accepted Submission(s): 279 Problem Description When ?? was born, seven crows flew

HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]

题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=6203] 题意 :给出一棵树,如果(a,b)路径上有坏点,那么(a,b)之间不联通,给出一些不联通的点对,然后判断最少有多少个坏点. 题解 :求每个点对的LCA,然后根据LCA的深度排序.从LCA最深的点对开始,如果a或者b点已经有点被标记了,那么continue,否者标记(a,b)LCA的子树每个顶点加1. #include<Bits/stdc++.h> using namespace std;