51nod1434 区间LCM

跟容斥没有关系。首先可以确定的一个结论是:对于任意正整数,有1*2*...*n | (k+1)*(k+2)*...*(k+n)。因为这就是$C_{n+k}^{k}$。

于是这题就有:m最多枚举到2n。

于是有一个做法:对n!分解质因数,然后枚举m的同时统计已获得的所有质因数的次幂,全部不小于n!时即可推出。

复杂度肯定不大于$O(n\log n)$。

同时这里有一个不会证的结论:找到n以内最大的$p^k$的数(p是质数),答案就是$2p^k$。

$O(n\log n)$

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
typedef long long ll;
using namespace std; const int N=;
int T,n,tot,cnt[N],cnt2[N],pr[N],b[N],id[N]; void init(int n){
rep(i,,n){
if (!b[i]) pr[++tot]=i,id[i]=tot;
for (int j=; j<=tot && pr[j]*i<=n; j++){
b[pr[j]*i]=;
if (i%pr[j]==) break;
}
}
} int main(){
init();
for (scanf("%d",&T); T--; ){
scanf("%d",&n); int g=;
for (int i=; i<=tot && pr[i]<=n; i++)
for (int j=pr[i]; j<=n; j*=pr[i]) g=max(g,j);
printf("%d\n",g*);
}
return ;
}

51nod1434

51nod1486 大大走格子

先把所有坏点按曼哈顿距离排序。

总方案数减去不合法方案的数量,枚举第一次走到的不合法格子(x,y),则答案就是(走合法格子到(x,y)的路径数)*C(n-x,m-y)。而走合法格子到(x,y)的路径数用同样的方法算即可。

$O(n^2)$

 #include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
using namespace std; const int N=,mod=1e9+;
int n,m,K,fac[N],inv[N],f[N];
struct P{ int x,y; }p[N];
bool operator <(const P &a,const P &b){ return (a.x==b.x) ? a.y<b.y : a.x<b.x; }
int C(int n,int m){ return n<m ? : 1ll*fac[n]*inv[m]%mod*inv[n-m]%mod; } int ksm(int a,int b){
int res=;
for (; b; a=1ll*a*a%mod,b>>=)
if (b & ) res=1ll*res*a%mod;
return res;
} void init(int n){
fac[]=; rep(i,,n) fac[i]=1ll*fac[i-]*i%mod;
inv[n]=ksm(fac[n],mod-);
for (int i=n-; ~i; i--) inv[i]=1ll*inv[i+]*(i+)%mod;
} int main(){
scanf("%d%d%d",&n,&m,&K); init(n+m);
rep(i,,K) scanf("%d%d",&p[i].x,&p[i].y);
sort(p+,p+K+); p[++K]=(P){n,m};
rep(i,,K){
int res=C(p[i].x+p[i].y-,p[i].x-);
rep(j,,i-) if (p[j].x<=p[i].x && p[j].y<=p[i].y)
res=(res-1ll*f[j]*C(p[i].x-p[j].x+p[i].y-p[j].y,p[i].x-p[j].x)%mod+mod)%mod;
f[i]=res;
}
printf("%d\n",f[K]);
return ;
}

51nod1486

51nod1678 lyk与gcd

简单莫比乌斯容斥,答案是$\sum\limits_{d|x}\mu(d)\sum\limits_{d|i}a[i]$。

先线性筛出$\mu$,再对每个d维护$\sum\limits_{d|i}a[i]$,事先将每个数的因子全部预处理出来以减小常数。

$O(n*n^\frac{1.44}{\ln \ln n})$(据说n的因子个数是$n^\frac{1.44}{\ln \ln n}$级别的,当然肯定不满)

 #include<vector>
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
typedef long long ll;
using namespace std; const int N=;
int n,Q,tot,op,x,k,a[N],sm[N],miu[N],pr[N],b[N];
vector<int>ve[N]; void init(int n){
rep(i,,n){
if (!b[i]) pr[++tot]=i,miu[i]=-;
for (int j=; j<=tot && pr[j]*i<=n; j++){
b[pr[j]*i]=;
if (i%pr[j]==) { miu[pr[j]*i]=; break; }
else miu[pr[j]*i]=-miu[i];
}
}
rep(i,,n) for (int j=i; j<=n; j+=i) ve[j].push_back(i);
} int main(){
scanf("%d%d",&n,&Q); miu[]=; init();
rep(i,,n){
scanf("%d",&a[i]); int ed=ve[i].size()-;
rep(j,,ed) sm[ve[i][j]]+=a[i];
}
rep(i,,Q){
scanf("%d",&op);
if (op==){
scanf("%d%d",&x,&k); int ed=ve[x].size()-;
rep(i,,ed) sm[ve[x][i]]+=k-a[x];
a[x]=k;
}else{
scanf("%d",&x); int ed=ve[x].size()-; ll res=;
rep(i,,ed) res+=sm[ve[x][i]]*miu[ve[x][i]];
printf("%lld\n",res);
}
}
return ;
}

51nod1678

51nod1406 与查询

比较巧妙的DP,具体见代码。注意这题需要快速读入与输出。

$O(A\log A)$

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
typedef long long ll;
using namespace std; const int N=;
int n,x,mx,ww[],f[N]; inline void rd(int &x){
x=; char ch=getchar();
while (ch<'' || ch>'') ch=getchar();
while (ch>='' && ch<='') x=(x<<)+(x<<)+(ch^),ch=getchar();
} inline void pr(int x){
int tot=;
if (!x) { putchar(''); return; }
while (x) ww[++tot]=x%,x/=;
while (tot) putchar(ww[tot--]+'');
} int main(){
rd(n);
rep(i,,n) rd(x),mx=max(mx,x),f[x]++;
for (int i=; i<=mx; i<<=)
for (int j=mx; j; j--) if (i&j) f[j-i]+=f[j];
rep(i,,) pr(f[i]),putchar('\n');
return ;
}

51nod1406

51nod1407 与与与与

考虑容斥,求“相邻后至少k位为1”的方案数f(x),答案就是$2^{f(x)}-1$。求f(x)就是上一道题。

$O(A\log A)$

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
typedef long long ll;
using namespace std; const int N=,mod=1e9+;
int n,x,mx,ans,f[N]; int ksm(int a,int b){
int res=;
for (; b; a=1ll*a*a%mod,b>>=)
if (b & ) res=1ll*res*a%mod;
return res;
} int Cnt(int x){
int res=;
for (; x; x>>=) if (x&) res=-res;
return res;
} int main(){
while (~scanf("%d",&n)){
rep(i,,mx) f[i]=; mx=ans=;
rep(i,,n) scanf("%d",&x),mx=max(mx,x),f[x]++;
for (int i=; i<=mx; i<<=)
for (int j=mx; j; j--) if (i&j) f[j-i]+=f[j];
rep(i,,mx) ans=(ans+Cnt(i)*(ksm(,f[i])-))%mod;
printf("%d\n",(ans+mod)%mod);
}
return ;
}

51nod1407

51nod1667 概率好题

好题。https://blog.csdn.net/samjia2000/article/details/53025218

$O(2^{k1+k2})$

 #include<cstdio>
#include<algorithm>
#include<cstring>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
using namespace std; const int N=,mod=1e9+;
int T,n,m,l,r,s,sm,ans1,ans2,ans3,len[N]; int ksm(int a,int b){
int res=;
for (; b; a=1ll*a*a%mod,b>>=)
if (b & ) res=1ll*res*a%mod;
return res;
} int C(int n,int m){
if (n<m) return ;
int res=;
rep(i,,m) res=1ll*res*(n-m+i)%mod*ksm(i,mod-)%mod;
return res;
} void dfs(int x,int t,int d){
if (x>n+m){
ans1=(ans1+1ll*t*C(sm-d+n+m-,n+m)+mod)%mod;
ans2=(ans2+1ll*t*C(sm-d+n+m-,n+m-)+mod)%mod;
return;
}
dfs(x+,t,d); dfs(x+,-t,d+len[x]);
} int main(){
for (scanf("%d",&T); T--; ){
scanf("%d",&n); s=; sm=ans1=ans2=;
rep(i,,n) scanf("%d%d",&l,&r),sm+=r,len[i]=r-l+,s=1ll*s*len[i]%mod;
scanf("%d",&m);
rep(i,,m) scanf("%d%d",&l,&r),sm-=l,len[i+n]=r-l+,s=1ll*s*len[i+n]%mod;
dfs(,,); ans3=(1ll*s-ans1-ans2+mod+mod)%mod; s=ksm(s,mod-);
ans1=1ll*ans1*s%mod; ans2=1ll*ans2*s%mod; ans3=1ll*ans3*s%mod;
printf("%d %d %d\n",ans1,ans2,ans3);
}
return ;
}

51nod1667

51nod部分容斥题解的更多相关文章

  1. [SDOI2009]Bill的挑战——全网唯一 一篇容斥题解

    全网唯一一篇容斥题解 Description Solution 看到这个题,大部分人想的是状压dp 但是我是个蒟蒻没想到,就用容斥切掉了. 并且复杂度比一般状压低, (其实这个容斥的算法,提出来源于y ...

  2. 2 3 5 7的倍数 (51Nod - 1284)[容斥定理]

    20180604 给出一个数N,求1至N中,有多少个数不是2 3 5 7的倍数. 例如N = 10,只有1不是2 3 5 7的倍数. Input 输入1个数N(1 <= N <= 10^1 ...

  3. 洛谷P4707 重返现世(扩展MinMax容斥+dp)

    传送门 我永远讨厌\(dp.jpg\) 前置姿势 扩展\(Min-Max\)容斥 题解 看纳尔博客去→_→ 咱现在还没搞懂为啥初值要设为\(-1\)-- //minamoto #include< ...

  4. 【题解】Counting D-sets(容斥+欧拉定理)

    [题解]Counting D-sets(容斥+欧拉定理) 没时间写先咕咕咕. vjCodeChef - CNTDSETS 就是容斥,只是难了一二三四五\(\dots \inf\)点 题目大意: 给定你 ...

  5. 【题解】CF559C C. Gerald and Giant Chess(容斥+格路问题)

    [题解]CF559C C. Gerald and Giant Chess(容斥+格路问题) 55336399 Practice: Winlere 559C - 22 GNU C++11 Accepte ...

  6. 51Nod 1486 大大走格子 —— 容斥

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1486 对于每个点,求出从起点到它,不经过其他障碍点的方案数: 求一 ...

  7. [CQOI2014]数三角形 题解(组合数学+容斥)

    [CQOI2014]数三角形 题解(数论+容斥) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1328780 链接题目地址:洛谷P3166 BZOJ 350 ...

  8. 51nod 1518 稳定多米诺覆盖(容斥+二项式反演+状压dp)

    [传送门[(http://www.51nod.com/Challenge/Problem.html#!#problemId=1518) 解题思路 直接算不好算,考虑容斥,但并不能把行和列一起加进去容斥 ...

  9. 【题解】毒蛇越狱(FWT+容斥)

    [题解]毒蛇越狱(FWT+容斥) 问了一下大家咋做也没听懂,按兵不动没去看题解,虽然已经晓得复杂度了....最后感觉也不难 用FWT_OR和FWT_AND做一半分别求出超集和和子集和,然后 枚举问号是 ...

随机推荐

  1. python学习笔记(十二)之函数

    牛刀小试: 定义一个无参函数 >>> def myFirstFunc(): ... print("Hello python") ... print("h ...

  2. [SCOI2010]生成字符串 题解(卡特兰数的扩展)

    [SCOI2010]生成字符串 Description lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数 ...

  3. tf.name_scope tf.variable_scope学习

    1. 首先看看比较简单的 tf.name_scope(‘scope_name’). tf.name_scope 主要结合 tf.Variable() 来使用,方便参数命名管理. ''' Signatu ...

  4. UBIFS学习笔记

    在做项目的时候,发现flash芯片有异常现象,经过打印分析,发现是UBIFS方面设置有一些问题,经过查阅一部分资料,最终得到问题的答案. 在解决问题的过程中,发现打印信息比较重要,但网上并没有直接的相 ...

  5. 【转载】如何解决failed to push some refs to git

    在使用git 对源代码进行push到gitHub时可能会出错,信息如下   此时很多人会尝试下面的命令把当前分支代码上传到master分支上. $ git push -u origin master ...

  6. C# Selenium with PhantomJSDriver get image width and height (获取图片的长和高)

    //get image width and height var image=driver.FindElement(By.ClassName("it-Header_authorImage&q ...

  7. JVM的分区+查看GC对象是否存活+3种GC算法+7种垃圾收集器+如何减少GC次数

    一.JVM的分区:   1.程序计数器(私有) 程序计数器是一块较小的内存分区,你可以把它看做当前线程所执行的字节码的指示器. 在虚拟机的概念模型里,字节码解释器工作时,就是通过改变计数器的值来选择下 ...

  8. Deep Learning基础--理解LSTM网络

    循环神经网络(RNN) 人们的每次思考并不都是从零开始的.比如说你在阅读这篇文章时,你基于对前面的文字的理解来理解你目前阅读到的文字,而不是每读到一个文字时,都抛弃掉前面的思考,从头开始.你的记忆是有 ...

  9. 利用Google API生成二维码

    什么是二维码:二维码是二维条形码的一种,可以将网址.文字.照片等信息通过相应的编码算法编译成为一个方块形条码图案,手机用户可以通过摄像头和解码软件将相关信息重新解码并查看内容.读取方式:利用30万画素 ...

  10. PHP取整函数ceil,floor,round,intval的区别

    ceil — 进一法取整 float ceil ( float $value ) 返回不小于 value 的下一个整数,value 如果有小数部分则进一位.ceil() 返回的类型仍然是 float, ...