列表

详情


NC256071. 小红的树构造

描述

小红想让你构造一棵树,共有n个节点,其中有k个节点权值为2,n-k个节点的权值为3。
小红定义路径权值为路径上所有点权值乘积的因子数量。只有长度不小于1的路径是有效的(u到v、v到u是同一条路径)。
小红希望所有的路径的权值乘积尽可能小,你能帮帮她吗?
你不需要输出构造出的树,只需要输出最小的权值乘积即可。答案对10^9+7取模。

输入描述

两个正整数nk,用空格隔开。
2 \leq n \leq 10^9
0 \le k \le n

输出描述

最小的权值乘积对10^9+7取模的值。

示例1

输入:

4 3

输出:

5184

说明:

我们构造这样一棵树:
1、2、3号节点权值为2。4号节点权值为3。
1和2连一条边,2和3连一条边,2和4连一条边。
这样共有6条路径:
1-2路径,点权乘积为4,4有3个因子,因此该路径权值为3。
2-3路径,点权乘积为4,4有3个因子,因此该路径权值为3。
2-4路径,点权乘积为6,6有4个因子,因此该路径权值为4。
1-2-3路径,点权乘积为8,8有4个因子,因此该路径权值为4。
1-2-4路径,点权乘积为12,12有6个因子,因此该路径权值为6。
3-2-4路径,点权乘积为12,12有6个因子,因此该路径权值为6。
所有路径权值乘积为5184。
可以证明,这样构造的权值乘积是最小的。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 488K, 提交时间: 2023-07-31 16:16:39

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
const int mod=1e9+7;
int n,m,k;
int q(int x,int y){
	int sum=1;
	while(y){
		if(y%2==1){
			sum*=x;
		}
		sum%=mod;
		x*=x;
		x%=mod;
		y/=2;
	}
	return sum;
}
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>n>>k;
	k=max(k,n-k);
	cout<<q(4,n-k)*q(3,k-1)%mod*q(4,(k-1)*(k-2)/2)%mod*q(6,(n-k)*(n-k-1)/2)%mod*q(6,(n-k)*(k-1))%mod<<endl;;
	return 0;
} 

C++(clang++ 11.0.1) 解法, 执行用时: 3ms, 内存消耗: 420K, 提交时间: 2023-07-30 22:00:52

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl "\n"
const ll m = 1000000007;

ll mi(ll x,ll y){
	ll sum=1;
	for(; y ; y >>=1 , x=x*x%m){
		if(y&1)sum=sum*x%m;
	}
	return sum;
} 

void solve(){
	ll n,k;
	cin >> n >> k;
	k=max(k,n-k);
	cout << mi(4,n-k)*mi(3,k-1)%m*mi(4,(k-1)*(k-2)/2)%m*mi(6,(n - k)*(n-k-1)/2)%m*mi(6,(n-k)*(k-1))%m;
	return ;
}

int main(){
	ll t=1;//cin >> t;
	while(t--){
		solve();
	}
	return 0;
}

pypy3 解法, 执行用时: 70ms, 内存消耗: 21188K, 提交时间: 2023-07-31 16:39:54

from sys import stdin

mod = int(1e9)+7

def qmi(a,b,p):
    res = 1
    while b:
        if b&1==1:
            res = res*a%p
        b>>=1
        a = a*a%p
    return res 

n,k = map(int,stdin.readline().split())

a = k
b = n-k

if a<b:
    a,b = b,a
    
ans = qmi(3,a-1,mod)*qmi(4,(a-1)*(a-2)//2,mod)%mod*qmi(6,(a-1)*b,mod)%mod*qmi(4,b,mod)%mod*qmi(6,b*(b-1)//2,mod)%mod

print(ans)

Python3 解法, 执行用时: 42ms, 内存消耗: 4624K, 提交时间: 2023-08-01 17:00:20

n,k=map(int,input().split())
a,b=sorted([k,n-k])
p=int(1e9)+7
c=b-1
print(pow(3,c,p)*pow(2,a+a+(c-1)*c,p)%p*pow(6,a*c+a*(a-1)//2,p)%p)

上一题