Uva 1645 Count

给个题目链接:https://vjudge.net/problem/UVA-1645

题目大意是求有多少个n个节点的每一层节点都有相同数量儿子的树,将答案对10^9+7取模,多组询问。

可以很简单的发现下一层的节点数肯定是上一层的倍数,这样的话我们就调和级数一下,N^2 log N预处理 O(1)查询。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define ll long long
const int maxn=1005;
const int ha=1000000007;
using namespace std;
int f[maxn][maxn]; 
int ans[maxn],n,m;

inline int add(int x,int y){
	x+=y;
	if(x>=ha) return x-ha;
	else return x;
}

inline void init(){
	f[1][1]=1;
	for(int i=1;i<=1000;i++)
	    for(int j=1;j<=i;j++) if(f[i][j]){
	    	int base=f[i][j];
	    	ans[i]=add(ans[i],base);
	    	
	    	if(i<1000) for(int k=j,u=k+i;u<=1000;k+=j,u+=j) f[u][k]=add(f[u][k],base); 
		}
}

int main(){
	init();
	int cnt=0;
	while(scanf("%d",&n)==1){
		printf("Case %d: %d
",++cnt,ans[n]);
	}
	
	return 0;
}

  

原文地址:https://www.cnblogs.com/JYYHH/p/8454870.html