UOJ #54 时空穿梭 —— 计数+莫比乌斯反演+多项式系数
10分还要用 Lucas 定理囧...因为模数太小了不能直接算...
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
int const xn=1e5+,xm=,mod=;
int n,num,m[xm],jc[xn],jcn[xn];
ll pw(ll a,int b){ll ret=; for(;b;b>>=,a=a*a%mod)if(b&)ret=ret*a%mod; return ret;}
void init()
{
jc[]=; int mx=mod-;
for(int i=;i<=mx;i++)jc[i]=(ll)jc[i-]*i%mod;
jcn[mx]=pw(jc[mx],mod-);
for(int i=mx-;i>=;i--)jcn[i]=(ll)jcn[i+]*(i+)%mod;
}
int C(int n,int m){return (ll)jc[n]*jcn[m]%mod*jcn[n-m]%mod;}
int lucas(int n,int m)
{
if(m==||n<m)return ;
return (ll)lucas(n/mod,m/mod)*C(n%mod,m%mod)%mod;
}
int upt(int x){while(x>=mod)x-=mod; while(x<)x+=mod; return x;}
int main()
{
int T=rd(); init();
while(T--)
{
n=rd(); num=rd(); bool fl=;
for(int i=;i<=n;i++)
{
m[i]=rd();
if(m[i]>)fl=;
}
if(n==)printf("%d\n",lucas(m[],num));
}
return ;
}
10分
参考博客:https://www.cnblogs.com/ljh2000-jump/p/6242237.html
开头结尾思路好妙,莫比乌斯反演好套路;
忘记前缀和调了半天hhh。
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
int Min(int x,int y){return x<y?x:y;}
int const xn=,xm=1e5+,xc=,mod=;
int n,c,m[xn],a[xn],C[xm][xc],G[xc][xm],f[xc][xm][xn],mu[xm],cnt,pri[xm],inv2;
bool vis[xm];
ll pw(ll a,int b){ll ret=; for(;b;b>>=,a=a*a%mod)if(b&)ret=ret*a%mod; return ret;}
int upt(int x){while(x>=mod)x-=mod; while(x<)x+=mod; return x;}
void getpri()
{
int mx=1e5; mu[]=;
for(int i=;i<=mx;i++)
{
if(!vis[i])pri[++cnt]=i,mu[i]=-;
for(int j=;j<=cnt&&(ll)i*pri[j]<=mx;j++)
{
vis[i*pri[j]]=;
if(i%pri[j])mu[i*pri[j]]=-mu[i];
else break;
}
}
}
void init()
{
int mx=1e5;
for(int i=;i<=mx;i++)C[i][]=;
for(int i=;i<=mx;i++)
for(int j=;j<=;j++)
C[i][j]=upt(C[i-][j]+C[i-][j-]);
for(int c=;c<=;c++)
{
for(int g=;g<=mx;g++)
for(int T=g;T<=mx;T+=g)
G[c][T]=upt(G[c][T]+C[g-][c-]*mu[T/g]);
for(int T=;T<=mx;T++)
for(int i=,k=;i<=;i++,k=(ll)k*T%mod)
f[c][T][i]=(f[c][T-][i]+(ll)k*G[c][T])%mod;
}
}
void get(int t)//(px+q)
{
int tmp,p,q;
memset(a,,sizeof a); a[]=;//
for(int i=;i<=n;i++)
{
tmp=m[i]/t;
p=upt(-(ll)tmp*(tmp+)%mod*inv2%mod);
q=(ll)tmp*m[i]%mod;
for(int j=i;j;j--)
a[j]=upt((ll)a[j-]*p%mod+(ll)a[j]*q%mod);
a[]=upt((ll)a[]*q%mod);
}
}
int main()
{
int T=rd(); getpri(); init(); inv2=pw(,mod-);
while(T--)
{
n=rd(); c=rd(); int mn=xm,ans=;
for(int i=;i<=n;i++)m[i]=rd(),mn=Min(mn,m[i]);
for(int i=,nxt;i<=mn;i=nxt+)
{
nxt=m[]/(m[]/i);
for(int j=;j<=n;j++)nxt=Min(nxt,m[j]/(m[j]/i));
get(i);
for(int j=;j<=n;j++)ans=upt(ans+(ll)a[j]*(f[c][nxt][j]-f[c][i-][j])%mod);
}
printf("%d\n",ans);
}
return ;
}
UOJ #54 时空穿梭 —— 计数+莫比乌斯反演+多项式系数的更多相关文章
- BZOJ3434 WC2014时空穿梭(莫比乌斯反演)
考虑枚举相邻点距离差的比例.显然应使比例值gcd为1以保证不重复统计.确定比例之后,各维坐标的方案数就可以分开考虑.设比例之和为k,则若坐标上限为m,该维坐标取值方案数即为Σm-ki (i=1~⌊m/ ...
- 【51nod】1222 最小公倍数计数 莫比乌斯反演+组合计数
[题意]给定a和b,求满足a<=lcm(x,y)<=b && x<y的数对(x,y)个数.a,b<=10^11. [算法]莫比乌斯反演+组合计数 [题解]★具体 ...
- 51NOD 1222 最小公倍数计数 [莫比乌斯反演 杜教筛]
1222 最小公倍数计数 题意:求有多少数对\((a,b):a<b\)满足\(lcm(a,b) \in [1, n]\) \(n \le 10^{11}\) 卡内存! 枚举\(gcd, \fra ...
- 51nod1222 最小公倍数计数 莫比乌斯反演 数学
求$\sum_{i = 1}^{n} \sum_{j = 1}^{i} [lcm(i, j) \le n]$因为这样不好求,我们改成求$\sum_{i = 1}^{n} \sum_{j = 1}^{n ...
- BZOJ 3518 点组计数 ——莫比乌斯反演
要求$ans=\sum_{i=1}^n \sum_{j=1}^m (n-i)(m-j)(gcd(i,j)-1)$ 可以看做枚举矩阵的大小,然后左下右上必须取的方案数. 这是斜率单增的情况 然后大力反演 ...
- 数学:莫比乌斯反演-GCD计数
Luogu3455:莫比乌斯反演进行GCD计数 莫比乌斯反演就是用来解决这一类问题的,通常f函数是要求的那个,F函数是显然的 这样利用F的结果就可以推出来f的结果 在计算结果的时候整除分快儿一下就可以 ...
- 【BZOJ3434】[Wc2014]时空穿梭 莫比乌斯反演
[BZOJ3434][Wc2014]时空穿梭 Description Input 第一行包含一个正整数T,表示有T组数据求解每组数据包含两行,第一行包含两个正整数N,C(c>=2),分别表示空间 ...
- UOJ#54 BZOJ3434 [WC2014]时空穿梭
题目描述 小 X 驾驶着他的飞船准备穿梭过一个 \(n\) 维空间,这个空间里每个点的坐标可以用 \(n\) 个实数表示,即 \((x_1,x_2,\dots,x_n)\). 为了穿过这个空间,小 X ...
- loj#6076「2017 山东一轮集训 Day6」三元组 莫比乌斯反演 + 三元环计数
题目大意: 给定\(a, b, c\),求\(\sum \limits_{i = 1}^a \sum \limits_{j = 1}^b \sum \limits_{k = 1}^c [(i, j) ...
随机推荐
- linux---tar命令,vim编辑器,磁盘分区,挂载,链接
1) 将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) [root@bogon ~]# cp /etc/passwd ./ [root@bogon ~]# cp /etc/ ...
- iptables详解(12):iptables动作总结之一
前文一直在介绍iptables的匹配条件,并没有对动作进行过总结,那么此处,我们就来总结一下iptables中的动作. 之前的举例中已经用到了一些常用动作,比如ACCEPT.DROP.REJECT等. ...
- 创建自定义JSR303的验证约束(Creating custom constraints)
转载:http://clongjava.iteye.com/blog/1317649 由于输入验证在软件开发中是必须的一件事情,特别是与用户交互的软件产品,验证用户的潜在输入错误是必不可少的一件事情, ...
- Sql sever 事务
SQL事务 一.事务概念 事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行.因此事务是一个不可分割的工作逻辑单元.在数据库系统上执行并发操作时事务 ...
- Error:java: Compilation failed: internal java compiler error(转)
set中java complier 设置的问题 ,项目中有人用jdk1.6 有人用jdk1.7 版本不一样 会一起这个错误 进行如下操作: 原文链接:http://blog.csdn.net/ ...
- web服务器无法显示font-awesome字体图标
今天遇到了在本地运行网页 一切调用的额font的小图标都OK的,但是把网页发布到tomcat服务器上面就不行了 之后百度了下,找到了解决方法,遂记录下,方法如下: 在web.xml 文件中加上: &l ...
- 生产者与消费者的Java实现
首先创建maven工程,需要引入的包: <dependencies> <dependency> <groupId>org.apache.kafka</grou ...
- Chrome自定义最小字号
============= ============== =======================
- vue.js 源代码学习笔记 ----- core lifecycle
/* @flow */ import config from '../config' import Watcher from '../observer/watcher' import { mark, ...
- socket函数sendto与send的区别
C:socket相关的sendto()函数简介 http://blog.csdn.net/flytiger_ouc/article/details/19634279 文中提到SOCK_DGRAM, S ...