核反应堆
核反应堆
Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 22 Accepted Submission(s) : 13
Problem Description
某核反应堆有两类事件发生: 高能质点碰击核子时,质点被吸收,放出3个高能质点和1个低能质点; 低能质点碰击核子时,质点被吸收,放出2个高能质点和1个低能质点。 假定开始的时候(0微秒)只有一个高能质点射入核反应堆,每一微秒引起一个事件发生(对于一个事件,当前存在的所有质点都会撞击核子),试确定n微秒时高能质点和低能质点的数目。
Input
输入含有一些整数n(0≤n≤33),以微秒为单位,若n为-1表示处理结束。
Output
分别输出n微秒时刻高能质点和低能质点的数量,高能质点与低能质点数量之间以逗号空格分隔。每个输出占一行。
Sample Input
5 2-1
Sample Output
571, 20911, 4提示可以使用long long int对付GNU C++,使用__int64对付VC6
Source
2006/1/15 ACM程序设计期末考试
题目大意:每一个高能粒子撞击后会被吸收,且能够发射出三个高能粒子和一个低能粒子。每一个低能粒子撞击后会被吸收,且能够发射数两个高能粒子和一个低能粒子。每次撞击一微秒,其实时间为0,仅有一颗高能粒子开始撞击,问在第T秒的话,有多少个高能粒子和低能粒子。
解决该题目的话,由于每次一微秒高能粒子和低能粒子产生的结果都是一样的,可以直接弄个一个结构体数组来保存每第n微秒时候高能粒子和低能粒子的总数。根据题目直接写出高能粒子和低能粒子的递推公式:
NUM[i].Hight=NUM[i-1].Hight*3+NUM[i-1].Low*2;
NUM[i].Low=NUM[i-1].Hight+NUM[i-1].Low;
1 #include <stdio.h> 2 3 #include <stdlib.h> 4 5 typedef struct /*定义结构体*/ 6 7 { 8 9 long long Hight; /*高能粒子总数*/ 10 11 long long Low; /*低能粒子总数*/ 12 13 }HL; 14 15 HL NUM[35]; /*第n微秒*/ 16 17 int main() 18 19 { 20 21 int i,T; 22 23 NUM[0].Hight=1; /*初始化赋值*/ 24 25 NUM[0].Low=0; /*初始化赋值*/ 26 27 for(i=1;i<=33;i++) /*依次递推出每第n微秒的时候的高能粒子和低能粒子总数*/ 28 29 { 30 31 NUM[i].Hight=NUM[i-1].Hight*3+NUM[i-1].Low*2; 32 33 NUM[i].Low=NUM[i-1].Hight+NUM[i-1].Low; 34 35 } 36 37 while(scanf("%d",&T)!=EOF&&T!=-1) /*输入时间,直接输出在第T微秒时,高能粒子和低能粒子总数*/ 38 39 printf("%I64d, %I64d\n",NUM[T].Hight,NUM[T].Low); 40 41 return 0; 42 43 }
转载请备注:
**************************************
* 作者: Wurq
* 博客: https://www.cnblogs.com/Wurq/
* Gitee: https://gitee.com/wurq
**************************************
**************************************
* 作者: Wurq
* 博客: https://www.cnblogs.com/Wurq/
* Gitee: https://gitee.com/wurq
**************************************