JZOJ4816. label
来源:互联网 发布:各编程语言比较 编辑:程序博客网 时间:2024/05/17 09:42
题目大意
给定一棵大小为
现在要给每个结点赋值为一个整数,范围为
求所有合法方案数。
T组数据。
Data Constraint
题解
设状态
那么
然后可以发现对于每个
SRC
#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>using namespace std ;#define N 100 + 10#define M 100000 + 10typedef long long ll ;const int MO = 1e9 + 7 ;int Node[2*N] , Next[2*N] , Head[N] , tot ;ll f[N][M] , g[N] , S[N][M] ;int T , n , m , K ;int Size = 10000 ;void link( int u , int v ) { Node[++tot] = v ; Next[tot] = Head[u] ; Head[u] = tot ;}inline ll GetSum1( int x , int l ) { if ( l < 1 || l > m ) return 0 ; int B = Size ; if ( l <= min( m , B ) ) return S[x][l] ; else { if ( l <= m - B ) return (S[x][B] + (ll)(l - B) * g[x] % MO) % MO ; else return ((S[x][B] + (ll)(m - 2 * B) * g[x] % MO) % MO + (S[x][B] - S[x][m-l] + MO) % MO) % MO ; }}inline ll GetSum2( int x , int r ) { if ( r < 1 || r > m ) return 0 ; int B = Size ; if ( m <= B ) return (S[x][m] - S[x][r-1] + MO) % MO ; if ( r > m - B ) return S[x][m-r+1] ; if ( r > B ) return (S[x][B] + (ll)(m - B - r + 1) * g[x] % MO) % MO ; else return ((S[x][B] + (ll)(m - 2 * B) * g[x] % MO) + (S[x][B] - S[x][r-1] + MO) % MO) % MO ;}void DFS( int x , int Fa ) { g[x] = 1 ; for (int y = 1 ; y <= Size ; y ++ ) f[x][y] = 1 ; for (int p = Head[x] ; p ; p = Next[p] ) { if ( Node[p] == Fa ) continue ; if ( Node[p] == 36 ) { Node[p] ++ ; Node[p] -- ; } DFS( Node[p] , x ) ; for (int y = 1 ; y <= min( m , Size + 1 ) ; y ++ ) { ll ret = (GetSum1( Node[p] , y - K ) + GetSum2( Node[p] , y + K )) % MO ; if ( ret < 0 ) { ret ++ ; ret -- ; } if ( y == Size + 1 ) g[x] = ((ll)g[x] * ret) % MO ; else f[x][y] = ((ll)f[x][y] * ret) % MO ; } } for (int y = 1 ; y <= Size ; y ++ ) S[x][y] = (S[x][y-1] + f[x][y]) % MO ;}int Power( int x , int k ) { int s = 1 ; while ( k ) { if ( k & 1 ) s = (ll)s * x % MO ; x = (ll)x * x % MO ; k /= 2 ; } return s ;}int main() { freopen( "label.in" , "r" , stdin ) ; freopen( "label.out" , "w" , stdout ) ; scanf( "%d" , &T ) ; while ( T -- ) { tot = 0 ; Size = 10000 ; memset( f , 0 , sizeof(f) ) ; memset( g , 0 , sizeof(g) ) ; memset( S , 0 , sizeof(S) ) ; memset( Head , 0 , sizeof(Head) ) ; scanf( "%d%d%d" , &n , &m , &K ) ; for (int i = 1 ; i < n ; i ++ ) { int x , y ; scanf( "%d%d" , &x , &y ) ; link( x , y ) ; link( y , x ) ; } if ( !K ) { printf( "%d\n" , Power( m , n ) ) ; continue ; } if ( (n - 1) * K > Size ) Size = (n - 1) * K ; DFS( 1 , 0 ) ; printf( "%lld\n" , GetSum1( 1 , m ) ) ; } return 0 ;}
以上.
1 0
- [JZOJ4816]label
- 【JZOJ4816】label
- JZOJ4816. label
- NOIP提高组【JZOJ4816】label
- 【JZOJ4816】【NOIP2016提高A组五校联考4】label
- label
- Label
- label
- Label
- label
- Label
- label
- label
- label
- Label
- label
- label 调整label高度
- Label字体大小自适应label
- 给定一个数组,其中只有一个数出现一次,别的数都出现3次,找出这个数
- SortedSet接口与TreeSet实现类(一)
- 钱多的花不完是种怎样的体验?看老外如何花样炫富!
- Android异步加载(慕课网学习笔记)
- TCP-IP学习笔记七:Netty使用--简单通信编程3
- JZOJ4816. label
- npm scripts 使用指南
- 字符串匹配的KMP算法
- Linux下安装Tomcat服务器和部署Web应用
- 22个HTML5初级技巧
- 多线程实现数据库的并发操作
- 插入排序/选择排序/交换排序/归并排序/基数排序
- Java的作业
- SortedSet接口与TreeSet实现类(二)