[USACO19FEB]Moorio Kart
我们的神仙教练在考试里放了这道题,当时我非常惊讶啊
背包是\(O(n^3)\)的吧明明是带根号的好吧,那既然要优化的话
NTT!什么时候我们教练会在考试里放多项式了
模数\(1e9+7\)?
任意模数不存在的,我们开int128找一个大一点的\(NTT\)模数就可以了
还是说一下\(NTT\)的做法吧,发现我们要求长度大于\(Y\)的路径可能不太好求,于是我们正难则反一下,我们求出有多少种拼法可以使得路径长度小于\(Y\)就可以了
每一棵树里只能出一条路径,于是我们可以把一棵树的路径信息搞成一个多项式,系数代表这种长度的路径出现了多少次
我们把每棵树的多项式卷起来就是最后的答案了
并不保证随时能通过而且我们不怎么能看懂的代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define re register
#define _LL __int128
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#pragma GCC optimize(3)
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("Ofast,no-stack-protector")
char BB[1<<18],*S=BB,*T=BB;
const int maxn=1505;
inline int read() {
char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
struct E{int v,nxt,w;}e[maxn<<1];
const LL mod=4222124650659841;
const LL P=1e9+7;
_LL G[2],t,og;
_LL mi[2][16];
int head[maxn],sum[maxn];
int n,m,X,Y,tot,num;
int rev[10000],len,fa[maxn],vis[maxn],pre[maxn];
int tax[1501][2501];LL tp[maxn];
_LL A[9000],B[9000];
LL tmp=1,k=0;
inline void add(int x,int y,int w) {
e[++num].v=y;e[num].nxt=head[x];
head[x]=num;e[num].w=w;
}
inline _LL ksm(_LL a,LL b) {
_LL S=1;
while(b) {if(b&1ll) S=S*a%mod;b>>=1ll;a=a*a%mod;}
return S;
}
void exgcd(LL a,LL b,LL &x,LL &y) {
if(!b) {x=1,y=0;return;}
exgcd(b,a%b,y,x);
y-=a/b*x;
}
inline LL getInv(LL a) {
LL x,y;exgcd(a,P,x,y);
return (x%P+P)%P;
}
void write(LL x){
if(x==0){putchar(48);return;}
int len=0,dg[25];
while(x>0){dg[++len]=x%10ll;x/=10ll;}
for(int i=len;i>=1;i--)putchar(dg[i]+48);
}
inline void NTT(_LL *f,int o) {
for(re int i=0;i<len;i++) if(i<rev[i]) std::swap(f[i],f[rev[i]]);
for(re int i=2,k=0;i<=len;i<<=1,k++) {
int ln=i>>1;
LL og1;
if(!mi[o][k]) {mi[o][k]=og1=ksm(G[o],(mod-1)/i);}
else og1=mi[o][k];
for(re int l=0;l<len;l+=i) {
og=1;
for(re int x=l;x<ln+l;++x) {
t=(f[ln+x]*og)%mod;
f[ln+x]=(f[x]-t+mod)%mod;
f[x]=(f[x]+t)%mod;
og=(og*og1)%mod;
}
}
}
if(!o) return;
_LL inv=ksm(len,mod-2);
for(re int i=0;i<len;i++) f[i]=(f[i]*inv)%mod;
}
void dfs(int x,int Fa) {
++k;
fa[x]=Fa;vis[x]=1;
for(re int i=head[x];i;i=e[i].nxt) {
if(vis[e[i].v]) continue;
dfs(e[i].v,Fa);
}
}
void Dfs(int x,int fa,int p) {
for(re int i=head[x];i;i=e[i].nxt) {
if(e[i].v==fa) continue;
pre[e[i].v]=pre[x]+e[i].w;
if(pre[e[i].v]<Y) tax[p][pre[e[i].v]]++;
else tp[p]+=pre[e[i].v];
Dfs(e[i].v,x,p);
}
}
inline void mul() {
NTT(A,0),NTT(B,0);
for(re int i=0;i<len;i++) A[i]=(A[i]*B[i])%mod;
NTT(A,1);
for(re int i=0;i<Y;i++) A[i]%=P;
//中间取模的简易版任意模数NTT
for(re int i=Y;i<len;i++) A[i]=0;
}
int main() {
G[0]=19ll,G[1]=ksm(19ll,mod-2);
n=read(),m=read(),X=read(),Y=read();
for(re int x,y,z,i=1;i<=m;i++)
x=read(),y=read(),z=read(),add(x,y,z),add(y,x,z);
LL cnt=0,H=0,T=0;
for(re int i=1;i<=n;i++)
if(!vis[i]) {
k=0;++tot,dfs(i,tot);
k=k*(k-1ll)/2ll;sum[tot]=k;
tmp=(tmp*k)%P;
}
Y-=tot*X;
for(re int i=1;i<=n;i++) pre[i]=0,Dfs(i,0,fa[i]);
A[0]=1;len=1;while(len<Y+Y) len<<=1;
for(re int i=0;i<len;i++) rev[i]=rev[i>>1]>>1|((i&1)?len>>1:0);
for(re int i=1;i<=tot;i++) {
for(re int j=0;j<len;j++) B[j]=0;
LL inv=tmp*getInv(sum[i])%P;
for(re int j=0;j<Y;j++) {
B[j]=(tax[i][j]/2);
H+=(inv*(LL)j%P*(LL)(tax[i][j]/2ll)%P);
H%=P;
}
H+=inv*(tp[i]/2ll)%P;H%=P;
mul();
}
//H是所有环的长度和,tmp是所有环的方案数
//cnt是不满足条件的环的方案数,T是不满足条件的环的长度和
for(re int i=1;i<Y;i++)
cnt=(cnt+A[i])%P,T=(T+A[i]*(LL)i%P)%P;
H=(H-T+P)%P;
tmp=(tmp-cnt+P)%P;
H+=tmp*(LL)tot%P*(LL)X%P;H%=P;
if(tot==1) {write(H);return 0;}
if(tot==2) write(H*2ll%P);
else {
LL pw=2,now=4;tot-=2;
for(re int i=1;i<=tot;i++)
pw=(pw*now)%P,now=(now+2ll)%P;
write(H*pw%P);
}
return 0;
}
[USACO19FEB]Moorio Kart的更多相关文章
- [USACO19FEB]Moorio Kart(DP)
Luogu5243 题解 即O(N^2)暴力统计出每个森林的路径,从ctgn个集合中各选出一个数,使得长度>=Y的方案数. 用背包统计.具体实现: \(dp[i+j][0]\leftarrow ...
- DP小小结
入门题 : [Luogu1441]砝码称重 , [NOIP2015]子串 [AHOI2009]中国象棋 , 详见代码 [HNOI2007]梦幻岛宝珠 , 详见代码 [NOIP2012]开车旅行 , 没 ...
- 解题报告:luogu P5543 [USACO19FEB]The Great Revegetation S
题目链接:P5543 [USACO19FEB]The Great Revegetation S 好坑啊,都身败名裂了. 思路一: 考虑染色法,跑一遍搜所就好了,不给代码了. 思路二: 考虑并查集,我想 ...
- [USACO19FEB]Mowing Mischief
题目大意: 给定平面上的一些点,求这些点的一个\(LIS\),并且还需要满足下列式子最小: \[ \sum_{i=1}^{n-1}(a[i+1].x-a[i].x)*(a[i+1].y-a[i].y) ...
- P5242 [USACO19FEB]Cow Dating
题目链接 题意分析 首先我们可以得出计算公式 \[s_i=\prod_{k=1}^i(1-p_k)\] \[f_i=\sum_{k=1}^i\frac{p_k}{1-p_k}\] 那么 \[ans(i ...
- [USACO19FEB]Cow Dating
Luogu5242 通过观察数据,我们可以发现,右端点的取值是单调递增的.于是,我们可以极限一波,用一个双指针法,类似于队列. 右端点的取值满足以下公式: (1-p1)(1-p2)..(1-pn) * ...
- P5541 [USACO19FEB]Sleepy Cow Herding
ri,被黄题虐. 思路:贪心?? 提交:2次 错因:没有特判 题解: 先排序. 最小代价:固定区间长度为\(n\),我们扫一遍数组看区间最多包含几个数,设为 \(mx\) ,答案就是\(n-mx+1\ ...
- [USACO19FEB]Cow Dating——找规律
原题戳这里 题解 显然原题等价于让我们求这个式子\(\prod\limits_{i=l}^{r}(1-p_i)\sum\limits_{i=l}^{r}\frac{p_i}{1-p_i}\)的最大值是 ...
- [USACO19FEB]Painting the Barn G
题意 \(n\)个矩阵\((0\le x_1,y_1,x_2,y_2\le 200)\),可交,可以再放最多两个矩阵(这两个矩阵彼此不交),使得恰好被覆盖\(k\)次的位置最大.\(n,k\le 10 ...
随机推荐
- 从mysql中dump数据到本地
方法一:使用mysqldump命令,如: mysqldump -h10.90.6.237 -uf_insplat2car_r -P3306 -pxxxxxxxxx nbmp tb_tag_log -- ...
- python 软件管理规范
一.背景 软件开发是一个系统工程,当然编码实现是其中尤其重要的一个环节,关乎到功能需求的实现好坏.这个环节中除了编码这一硬功之外,与之相关的编码风格这一柔道,虽然没有直接决定功能的实现与否,但却在很大 ...
- MySQL的数据控制语言DCL
我们使用DDL的"CREATE USER"语句创建用户,新的SQL用户不允许访问属于其他SQL用户的表,也不能立即创建自己的表,它必须被授权.可以授予的权限包括以下几组: 1.列权 ...
- Nib加载的方式实现自定义TableView
实现的效果 实现原理: 通过在主界面中用Bundle 的LoadNib的方式进行自定义窗体文件加载并渲染界面 实现步骤 Step One 创建TableViewCell 窗体 Step Two 定义接 ...
- drupal smtp could not connect to smtp
情况说明: 使用了SMTP Authentication Support 模块. 配置都没问题,是从另一台服务器迁过来的网站和数据库. 原因是客户的smtp服务器限制了我们新服务器的IP. 验证方式t ...
- HTML 5 <input> placeholder 属性 实现搜索框提示文字点击输入后消失
H5之前要实现这个功能还要用到JS,H5出来之后新增加了placeholder属性,有了这个属性就就能轻松实现这个功能. 定义和用法 placeholder 属性提供可描述输入字段预期值的提示信息(h ...
- 自定义RatingBar评分控件
1.介绍 实现类似美团外卖评分供能,系统提供了RatingBar,今天来自定义一波,当做自定义view的一个学习,效果如下,能够滑动或者点击变化星星数量 2.自定义属性 在values目录下的attr ...
- redis list 查询、下标查询、删除、裁剪、压入弹出、队列实现
查询 lrange list 0 1 // 注意0和1之间是空格:这个命令和pop命令不一样,不会删除里面的值lrange list 0 -1 // 所有的 下标查询 lpush person zs ...
- local_listener参数的作用!
转自:http://warehouse.itpub.net/post/777/472788 pmon只会动态注册port等于1521的监听,否则pmon不能动态注册listener,要想让pmon动态 ...
- gitlab 启用HTTPS
NGINX设置 启用HTTPS 警告 Nginx配置会告诉浏览器和客户端,只需在未来24个月通过安全连接与您的GitLab实例进行通信.通过启用HTTPS,您需要至少在24个月内为您的实例提供安全连接 ...