正题

题目链接:https://ac.nowcoder.com/acm/contest/161/F


题目大意

给出\(n\)个点的一张图,求它的所有生成树中权值和为\(k\)的倍数的个数。输出答案对\(p\)取模

\(1\leq n,k\leq 100,1\leq m\leq 10^4,p\in[2,10^9]\cup Pri\)

数据保证\(k\equiv 1(mod\ p)\)


解题思路

一个想法是把一条边权看做\(x^w\)的多项式,用矩阵树定理乘起来后\(k\)的倍数的系数和就是答案。

但是这样系数是\(nk\)个,显然搞不定。

类似于CF917D-StrangerTree的做法我们可以带入若干个值然后跑矩阵数之后求出若干个点值。

但是这里是\(k\)的倍数,我们要模拟卷积,可以带入\(k\)个\(g\)满足\(g^k=1\)的就可以了。

这里保证了\(k\equiv 1(mod\ p)\),所以我们求出\(p\)的原根\(g\)然后带入\(g^{\frac{p-1}{k}\times i}(i\in[0,k-1])\)就可以了。

然后直接拉插求出\(x=0\)的点值就好了。

时间复杂度\(O(n^3k)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define ll long long
using namespace std;
const ll N=110;
struct node{
ll x,y,w;
}e[N*N];
ll n,m,k,P,g,x[N],y[N];
vector<ll> p;
ll power(ll x,ll b){
ll ans=1;
while(b){
if(b&1)ans=ans*x%P;
x=x*x%P;b>>=1;
}
return ans;
}
void Prime(){
ll x=P-1;
for(ll i=2;i*i<=x;i++)
if(x%i==0){
p.push_back(i);
while(x%i==0)x/=i;
}
if(x>1)p.push_back(x);
}
bool check(ll x){
for(ll i=0;i<p.size();i++)
if(power(x,(P-1)/p[i])==1)return 0;
return 1;
}
namespace Matrix{
ll a[N][N];
ll det(ll v){
memset(a,0,sizeof(a));
ll ans=1;
for(ll i=1;i<=m;i++){
ll x=e[i].x,y=e[i].y,w=power(v,e[i].w);
(a[x][y]+=P-w)%=P;(a[y][x]+=P-w)%=P;
(a[x][x]+=w)%=P;(a[y][y]+=w)%=P;
}
ll f=0;
for(ll i=1;i<n;i++){
for(ll j=i;j<n;j++)
if(a[j][i]){
if(i==j)break;
swap(a[i],a[j]);
f^=1;break;
}
ans=ans*a[i][i]%P;
ll inv=power(a[i][i],P-2);
for(ll j=i;j<n;j++)a[i][j]=a[i][j]*inv%P;
for(ll j=i+1;j<n;j++){
ll rate=P-a[j][i];
for(ll k=i;k<n;k++)
(a[j][k]+=rate*a[i][k])%=P;
}
}
return f?(P-ans):ans;
}
}
signed main()
{
scanf("%lld%lld%lld%lld",&n,&m,&k,&P);
Prime();g=1;
while(!check(g))
g++;
for(ll i=1;i<=m;i++)
scanf("%lld%lld%lld",&e[i].x,&e[i].y,&e[i].w);
for(ll i=1;i<=k;i++){
x[i]=power(g,(P-1)/k*(i-1));
y[i]=Matrix::det(x[i]);
}
ll ans=0;
for(ll i=1;i<=k;i++){
ll tmp=1;
for(ll j=1;j<=k;j++)
if(i!=j)tmp=tmp*(P-x[j])%P*power(x[i]-x[j],P-2)%P;
(ans+=tmp*y[i]%P)%=P;
}
printf("%lld\n",(ans+P)%P);
return 0;
}

最新文章

  1. yii2 如何在页面底部加载css和js
  2. ABBYY有哪些图像处理选项
  3. JS中数组Array的用法
  4. error: command &#39;x86_64-linux-gnu-gcc&#39; failed with exit status 1
  5. Hbase之使用多Get实例返回数据
  6. uiwebview 播放视频
  7. IOS8 : UIAlertController
  8. spring学习笔记1
  9. 【Unity3D与23种设计模式】外观模式(Facade)
  10. Linux vi常用命令
  11. HP 1010、 1020、 1022 、M1005激光打印机内部无卡纸,但机器仍提示卡纸?
  12. Bugku-CTF之成绩单(快来查查成绩吧)
  13. face_recognition
  14. kenlm的使用
  15. 错误 103 未能加载文件或程序集“Telerik.Web.UI”或它的某一个依赖项。磁盘空间不足。 (异常来自 HRESULT:0x80070070)
  16. 解压文件出错解决方法(invalid compressed data--format violated)
  17. mysql的密码忘记了怎么办
  18. python3 的 mysql 简单操作
  19. PI接口无法使用.net4以上的解决方法:无法嵌入互操作类型“PISDKClass”。请改用适用的接口。
  20. 25_ajax请求_使用fetch

热门文章

  1. 什么是.NET CLI CLR IL JIT GC,它们是如何工作的
  2. Socket入门Demo
  3. Spring Boot Mybatis注解:@Mapper和@MapperScan
  4. spring初始化源码浅析之关键类和扩展接口
  5. 基于 Mysql 实现一个简易版搜索引擎
  6. Spring Boot集成Redis集群(Cluster模式)
  7. PHP小数点后保留位数并四舍五入
  8. Python之requests模块-大文件分片上传
  9. 利用 Spring Boot 中的 @ConfigurationProperties,优雅绑定配置参数
  10. 20210819 Emotional Flutter,Medium Counting,Huge Counting,字符消除2