/*Computer Transformation
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6626 Accepted Submission(s): 2408
Problem Description
A sequence consisting of one digit, the number 1 is initially written into a computer. At each successive time step, the
computer simultaneously tranforms each digit 0 into the sequence 1 0 and each digit 1 into the sequence 0 1. So, after the
first time step, the sequence 0 1 is obtained; after the second, the sequence 1 0 0 1, after the third, the sequence
0 1 1 0 1 0 0 1 and so on.
How many pairs of consequitive zeroes will appear in the sequence after n steps?
Input
Every input line contains one natural number n (0 < n ≤1000).
Output
For each input n print the number of consecutive zeroes pairs that will appear in the sequence after n steps.
Sample Input
2
3
Sample Output
1
1
Source
Southeastern Europe 2005
Recommend
JGShining | We have carefully selected several similar problems for you: 1006 1143 1200 1063 1046
*/
#include<stdio.h>
#include<string.h>
int g[301], f[301];//g[i]表示第i步所擁有的1的個數,f[i]表示第i步所擁有的0的對數
//第1000個數接近300位
int main()
{
int n;
while(scanf("%d", &n) != EOF)
{
memset(f, 0, sizeof(f));
memset(g, 0, sizeof(g));
f[0] = 0;//the first
g[0] = 1;//the second
if(n == 1 || n == 2)
{
printf("%d\n", n-1);
continue;
}
for(int i = 3; i <= n; ++i)
{
int temp;
for(int j = 0; j < 301; ++j)//f*2
{
f[j] *= 2;
temp = f[j] + g[j];
f[j] = g[j];
g[j] = temp;
}
for(int j = 0; j < 301; ++j)
{
if(g[j] > 9)
{
g[j+1] += g[j]/10;
g[j] %= 10;
}
}
}
for(int i = 301; i >= 0; --i)
{
if(g[i] != 0)
{
for(int j = i; j >= 0; --j)
printf("%d", g[j]);
printf("\n");
break;
}
}
}
return 0;
}
題意:給出一個數1,每進行一次操作,數列中的1會變成01, 而0會變成10,求經過n步操作後,數列中00的對數。
思路:這個是個規律題,通過推敲可以發現f【i】 = f【i-1】 + f【i-2】*2,然後就是大數相加,其次要把握好第1000個數的長度是300,控制相加的上限,避免超時。