首页 > 其他分享 >1002 树屋阶梯

1002 树屋阶梯

时间:2024-12-10 18:20:48浏览次数:9  
标签:int res 阶梯 ans 树屋 include 1002

// 1002   树屋阶梯.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
http://oj.daimayuan.top/course/22/problem/1107

暑假期间,小龙报名了一个模拟野外生存作战训练班来锻炼体魄,训练的第一个晚上,教官就给他们出了个难题。
由于地上露营湿气重,必须选择在高处的树屋露营。小龙分配的树屋建立在一颗高度为 N+1
 尺(N为正整数)的大树上,正当他发愁怎么爬上去的时候,发现旁边堆满了一些空心四方钢材,经过观察和测量,
 这些钢材截面的宽和高大小不一,但都是 1尺的整数倍,教官命令队员们每人选取 N个空心钢材来搭建一个总高度为 N尺的阶梯来进入树屋,
 该阶梯每一步台阶的高度为 1尺,宽度也为 1尺。
 如果这些钢材有各种尺寸,且每种尺寸数量充足,那么小龙可以有多少种搭建方法?
以树屋高度为 4尺、阶梯高度 N=3尺为例,小龙一共有如图所示的 5种搭建方法:


输入格式
一个正整数 N(1≤N≤500),表示阶梯的高度。

输出格式
一个正整数,表示搭建方法的个数。(注:搭建方法个数可能很大。)

样例输入
3
样例输出
5
提示
对于100%
的数据,1≤N≤500。
*/


#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

const int N = 2010;
int primes[N], sum[N], cnt;
bool st[N];
int n;

void init() {
	for (int i = 2; i <= N - 1; i++) {
		if (!st[i]) primes[++cnt] = i;
		for (int j = 1; i * primes[j] <= N - 1; j++) {
			st[i * primes[j]] = true;
			if (i % primes[j] == 0) break;
		}
	}
}

int get(int a, int p) {
	int res = 0;
	while (a) {
		res += a / p;
		a /= p;
	}

	return res;
}

vector<int> mul(vector<int> a, int b) {
	vector<int> res;
	int t = 0;
	for (int i = 0; i < a.size()||t; i++) {
		if (i < a.size()) t += a[i] * b;
		res.push_back(t % 10);
		t /= 10;
	}
	return res;
}




int main()
{
	cin >> n;
	init();

	for (int i = 1; i <= cnt; i++)
		sum[i] = get(2 * n, primes[i]) - 2 * get(n, primes[i]);
	
	int c = n + 1;
	for (int i = 1; i <= cnt; i++) {
		while (c % primes[i] == 0) {
			c /= primes[i];
			sum[i]--;
			if (c == 1) break;
		}
	}

	vector<int> res;
	res.push_back(1);
	for (int i = 1; i <= cnt; i++) {
		for (int j = 1; j <= sum[i]; j++) {
			res = mul(res, primes[i]);
		}
	}

	for (int i = res.size() - 1; i >= 0; i--)cout << res[i];
	cout << endl;
	 

	return 0;
}

 
#include <cstdio>
#include <iostream>
#define maxn 120005
#define ll long long
using namespace std;
int n,g;
int a,b,fm[maxn],fz[maxn],ans[maxn*100];

int qpow(int a,int b){//快速幂
    int res=1;
    for(;b;b>>=1){
        if(b&1)res=res*a;
        a*=a;
    }
    return res;
}

//ans[0]存大整数的位数
void mul(int x){
    int k=0;//向前一步的进位
    for(int i=1;i<=ans[0];i++){
        ans[i]*=x;
        ans[i]+=k;
        k=ans[i]/10;
        ans[i]%=10;
    }
    while(k){
        ans[++ans[0]]+=k;
        k=ans[ans[0]]/10;
        ans[ans[0]]%=10;
    }
}

int main(){
    scanf("%d",&n);
    for(int i=2;i<=n;++i){
        a=n+i;//(n+2)*(n+3)*...*(2n) 分子
        for(int j=2;j*j<=a;j++){//质因数分解
            while(a%j==0)fz[j]++,a/=j;
        } 
        if(a>1) fz[a]++;
        b=i;//1*2*3*...*n 分母
        for(int j=2;j*j<=b;j++){
            while(b%j==0)fm[j]++,b/=j;
        }
        if(b>1) fm[b]++;
    }
    ans[0]=ans[1]=1;
    for(int i=2;i<=n*2;i++){
        if(fz[i]==0) continue;
        fz[i]=fz[i]-fm[i];
        if(fz[i]==0) continue;
        int x=qpow(i,fz[i]);
        if(x!=1) mul(x);
    }
    for(int i=ans[0];i>=1;--i) printf("%d",ans[i]);//注意要倒序输出
    return 0;
}

dp

#include<iostream>
#include<stdio.h>
using namespace std;
int f[550][500];//f[i][j]表示第i个数的第j位。 
int len=1;
void add(int u)
{
	for(int i=1;i<=len;i++)
		f[u][i]=f[u-1][i]+f[u][i];
	for(int i=1;i<=len;i++)
	{
		f[u][i+1]+=f[u][i]/10;
		f[u][i]%=10;
	}
	if(f[u][len+1])len++;
}
int main()
{
	int n,p;
	cin>>n;
	f[1][1]=1;
	for(int i=2;i<=n+1;i++)
		for(int j=1;j<=i;j++)
			add(j);
	for(int i=len;i>0;i--)
		cout<<f[n][i];
}


标签:int,res,阶梯,ans,树屋,include,1002
From: https://www.cnblogs.com/itdef/p/18597821

相关文章

  • 【洛谷】P1002 [NOIP2002 普及组] 过河卒
    #include<iostream>usingnamespacestd;constints1[]={0,-2,-1,1,2,2,1,-1,-2};constints2[]={0,1,2,2,1,-1,-2,-2,-1}; //马可以走到的位置,上下对应longlongf[80][80],s[80][80];intmain(){ longlongi,b1,b2,m1,m2; cin>>b1>......
  • B2B2C/B2C直播短视频种草多用户电商系统商家入驻阶梯拼团系统
    多终端(H5移动端、APP、微信小程序、微信公众号)、多用户商城系统拥有多种运营模式B2B2C/B2C,内置独立商家后台、商城装修、短视频、社区种草、全终端直播、阶梯拼团,智能客服等功能,拥有配置完整的Uni-APP客户端工程源码,前后端无加密源码,方便自行二次开发,私有化部署!功能特性多......
  • 洛谷 P1002 [NOIP2002 普及组] 过河卒
    你好,我是gwg725。洛谷账号:大号小号欢迎与我讨论。:)题目描述:棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上的某一点有一个对方的马(如C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点,如图3-1中的C点和P1,……,P8,卒不能通过......
  • 爱因斯坦阶梯问题
    爱因斯坦阶梯问题是一个著名的逻辑谜题,它描述了爱因斯坦提出的一个关于楼梯的智力题。这个问题的C语言实现通常涉及循环和条件判断。由于问题没有给出具体的描述,我假设你是指的爱因斯坦阶梯问题的一个常见版本:一个人爬楼梯,每次可以爬1步、2步或3步,问有多少种不同的方式可以爬到n阶......
  • LNGS1002 2024 Social Dialectology
    LNGS10022024Assignment2-SocialDialectologyRELEASED Wednesday28th AugustDUE Sunday8th September,11:59pmviaTurnitinToensureanonymousmarking,pleasedonotincludeyournameorSIDonthe assignment.WhenyousubmityourassignmentinCanv......
  • P1002 [NOIP2002 普及组] 过河卒
    题目描述棋盘上 A 点有一个过河卒,需要走到目标 B 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。棋盘用坐标表示,A 点 (0,0)、B 点 (n,m),同样马的位置坐......
  • 【C语言初阶】掌握C语言调试技巧,迈向高效编程的阶梯
    ......
  • 2024杭电多校第十场 1002树上询问(题解)
    题意给一棵树,每个节点有一个权值,并且权值是一个排列。接下来有多次操作,每次操作要么是交换两个节点权值,要么是询问一个权值区间\([L,R]\),判断是否存在树上的一个路径,使得路径上的权值恰好都在这个区间里分析由于询问的是树上的一个路径,联想到了树上莫队中对路径的处理。这里......
  • INF10025 Data Management and Analytic
    INF10025 Data ManagementandAnalyticTask 1– PassandCreditOverview •    See Canvas → Assignments for due date•   To complete your learning portfolio,every few weeks we ask you to complete a set of tasks, documen......
  • PAT1002 写出这个数
    读入一个正整数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。输入格式:每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10100。输出格式:在一行内输出n的各位数字之和的每一位,拼音数字间有1空格,但一行中最后一个拼音数字后没有空格。输入样......