地址:http://acm.hdu.edu.cn/showproblem.php?pid=5768

Lucky7

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

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 and sent it back to the shore. It is said that ?? used to surrounded by 7 candles when he faced a extremely difficult problem, and always solve it in seven minutes. 
?? once wrote an autobiography, which mentioned something about himself. In his book, it said seven is his favorite number and he thinks that a number can be divisible by seven can bring him good luck. On the other hand, ?? abhors some other prime numbers and thinks a number x divided by pi which is one of these prime numbers with a given remainder ai will bring him bad luck. In this case, many of his lucky numbers are sullied because they can be divisible by 7 and also has a remainder of ai when it is divided by the prime number pi.
Now give you a pair of x and y, and N pairs of ai and pi, please find out how many numbers between x and y can bring ?? good luck.
 
Input
On the first line there is an integer T(T≤20) representing the number of test cases.
Each test case starts with three integers three intergers n, x, y(0<=n<=15,0<x<y<1018) on a line where n is the number of pirmes. 
Following on n lines each contains two integers pi, ai where pi is the pirme and ?? abhors the numbers have a remainder of ai when they are divided by pi. 
It is guranteed that all the pi are distinct and pi!=7. 
It is also guaranteed that p1*p2*…*pn<=1018 and 0<ai<pi<=105for every i∈(1…n).
 
Output
For each test case, first output "Case #x: ",x=1,2,3...., then output the correct answer on a line.
 
Sample Input
2
2 1 100
3 2
5 3
0 1 100
 
Sample Output
Case #1: 7
Case #2: 14

Hint

For Case 1: 7,21,42,49,70,84,91 are the seven numbers.
For Case2: 7,14,21,28,35,42,49,56,63,70,77,84,91,98 are the fourteen numbers.

 
题意:
  就是问有多少个幸运数,然后幸运数呢,就是能被7整除的数,但是这些数可能被污染,哪些数会被污染呢,就是有n种方法会被污染,每种方法给出一个ai,一个
  pi,如果幸运数%pi等于ai就会被污染,然后给你一个区间,问这个区间有多少个没被污染的幸运数。
 
题解:
  这题一开始就知道是个中国剩余定理,然后看了多篇题解,发现要用容斥+中国剩余定理,然后发现要爆long long,必须要加上一个快速乘法=。=,然后求逆元的时候
  不能用费马小定理=。=,因为快速幂要爆long long,用快速乘法就会T(I good vegetable a),最后只有学了一波欧几里德求逆元TAT。
  先对着标程看了半天他在写啥,然后发现标程是先状态压缩,然后再容斥=。=,看标程就看了好久,我是不是没救了QAQ。
 
代码:
 #include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<cstring>
#include<queue>
#include<set>
#include<string>
#include<map>
#define inf 9223372036854775807
#define INF 9e7+5
#define PI acos(-1)
using namespace std;
typedef long long ll;
typedef double db;
typedef long long LL;
const int maxn = 1e2 + ;
const int mod = 1e9 + ;
const db eps = 1e-;
ll n, l, r, ai[maxn], pi[maxn]; int Bitcount(ll x) {
return x ? Bitcount(x >> ) + (x&1LL) : ;
} //求当前状态选择的方程的个数 ll q_mul(ll a, ll b, ll mod) {
ll ret = ;
while (b) {
if (b & ) ret = (ret + a) % mod;
b >>= ;
a = (a + a) % mod;
}
return ret;
} // 快速乘法 void Ex_Gcd(ll a, ll b, ll &x, ll &y){
ll d;
if(b==){
x=,y=;
return;
}
Ex_Gcd(b,a%b,y,x);
y-=a/b*x;
} // 这里直接抄的标程的函数。。 ll CRT(ll p[], ll a[], ll cnt) {
ll M = ;
ll res = ;
for (int i = ; i <= cnt; i++) M *= p[i];
for (int i = ; i <= cnt; i++) {
ll m = M / p[i], x, y;
Ex_Gcd(m, p[i], x, y);
res = (res + q_mul(q_mul(x, m, M), a[i], M)) % M;
}
return (res + M) % M;
} ll solve(ll x) {
ll p[maxn], m[maxn], ans = ;
p[] = , m[] = ;
if (!x) return ;
for (ll i = ; i < (1LL << n); i++) {
ll num = Bitcount(i), t = , cnt = ;
for (ll j = ; j < n; j++) {
if (i & (1LL << j)) {
p[++cnt] = pi[j];
m[cnt] = ai[j];
t *= pi[j];
}
}
ll res = CRT(p, m, cnt);
if (res > x) continue;
if (num & ) ans -= (x - res) / t + ; //容斥一下
else ans += (x - res) / t + ;
}
return ans + x / ;
} int main() {
//cin.sync_with_stdio(false);
//freopen("tt.txt", "r", stdin);
//freopen("isharp.out", "w", stdout);
int t, cas = ; cin >> t;
while (t--) {
cin >> n >> l >> r;
for (int i = ; i < n; i++)
cin >> pi[i] >> ai[i];
printf("Case #%d: %I64d\n", cas++, solve(r) - solve(l-));
}
return ;
}

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

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

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5768 题目大意: T组数据,求L~R中满足:1.是7的倍数,2.对n个素数有 %pi!=ai  的数 ...

  2. bzoj 3782 上学路线 卢卡斯定理 容斥 中国剩余定理 dp

    LINK:上学路线 从(0,0)走到(n,m)每次只能向上或者向右走 有K个点不能走求方案数,对P取模. \(1\leq N,M\leq 10^10 0\leq T\leq 200\) p=10000 ...

  3. HDU 4635 多校第四场 1004 强联通

    我还有什么好说,还有什么好说...... 我是SBSBSBSBSBSBSBSBSBSBSBSBBSBSBSBSBSBSBSBSBS........................ 题意 思路什么的都不 ...

  4. HDU暑假多校第四场J-Let Sudoku Rotate

    一.题意 Sudoku is a logic-based, combinatorial number-placement puzzle, which is popular around the wor ...

  5. HDU 全国多校第四场 题解

    题解 A AND Minimum Spanning Tree 参考代码: #include<bits/stdc++.h> #define maxl 200010 using namespa ...

  6. 2018 HDU多校第四场赛后补题

    2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...

  7. 牛客多校第四场sequence C (线段树+单调栈)

    牛客多校第四场sequence C (线段树+单调栈) 传送门:https://ac.nowcoder.com/acm/contest/884/C 题意: 求一个$\max {1 \leq l \le ...

  8. Harvest of Apples (HDU多校第四场 B) (HDU 6333 ) 莫队 + 组合数 + 逆元

    题意大致是有n个苹果,问你最多拿走m个苹果有多少种拿法.题目非常简单,就是求C(n,0)+...+C(n,m)的组合数的和,但是询问足足有1e5个,然后n,m都是1e5的范围,直接暴力的话肯定时间炸到 ...

  9. HDU How many integers can you find 容斥

    How many integers can you find Time Limit: 12000/5000 MS (Java/Others)    Memory Limit: 65536/32768 ...

随机推荐

  1. 【NOIP 2003】 加分二叉树

    [题目链接] 点击打开链接 [算法] 树形DP即可 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 50 in ...

  2. javascript之this指向

    情况一: 如果一个函数中有this,但是没有被上一级调用,this指向window 例: function a(){ var num='11'; console.log(this.num);  //u ...

  3. IT行业怎么了?程序员按时上下班也被开除

    转自:https://blog.csdn.net/keymo_/article/details/7783389 近日看了一条新闻是京东员工按时上下班遭“被离职”.话说一员工入职一个多月以来,每天保质保 ...

  4. 洛谷 - P1426 - 小鱼会有危险吗 - 模拟

    https://www.luogu.org/problemnew/show/P1426 题目说的是小鱼进入探测器一秒后就会有危险,所以不应该让小鱼先游,而是先检测探测器. #include<bi ...

  5. 51nod 1004 【快速幂】

    思路: 掐住最后一位,快速幂一发就好了 #include<cstdio> #include <map> #include<iostream> #include< ...

  6. lightoj1231【背包】

    题意: 有n种货币,已知每种货币的价值和数量. 给出一个k,问最多能组成k的方法.这个数量很大,需要mod 1e8+7. 思路: 额....这一题和上一篇的差不多,直接传送门: (此题很棒) 这里的话 ...

  7. bzoj 4551: [Tjoi2016&Heoi2016]树【并查集】

    看起来像是并查集,但是是拆集合,考虑时间倒流,先把标记都打上,然后把并查集做出来 每次到一个修改点就把这个点的计数s[u]--,当这个s为0时就把这个点和他的父亲合并(因为可能有多次标记) #incl ...

  8. 鸟哥私房菜基础篇:Linux是什么习题

    猫宁!!! 参考链接:http://cn.linux.vbird.org/linux_basic/0110whatislinux.php#ex 鸟哥是为中国信息技术发展做出巨大贡献的人. 1-你在你的 ...

  9. C++类的默认函数

    在C++中,一个类有八个默认函数: 默认构造函数: 默认拷贝构造函数: 默认析构函数: 默认重载赋值运算符函数: 默认重载取址运算符函数: 默认重载取址运算符const函数: 默认移动构造函数(C++ ...

  10. elasticsearch接口开发(新)

    此文在上一篇文章的基础上稍做了些许修改,主要在springboot整合ES后的包路径上,如下是新的目录结构 下面贴出代码 MyConfig.java package com.ylht.config; ...