1850: Dynamic Programming
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 27 Solved: 21
Submit Status Web Board
Description
As we know(众所周知),豆子是一个思维敏捷的人,某日他煞费苦心终于推出来了一个题目的解题方法如下图所示:
<!--[endif]-->
输入一个整数n之后,做如图运算之后,dp[n]就是我们要的答案。然而就在这个时候豆子发现这道题的n最大是100,000,这个程序将会超时,于是哭晕在了墙角。机智的你快来帮豆子优化下这个程序安慰他吧!
Input
首先输入一个整数T,代表有T组测试实例。(1<=T<=10)
对于每组测试,输入一行包含一个整数n,如题目所示。(1<=n<=100,000)
Output
对于每组测试实例,输出一个整数占一行,代表程序的答案,也就是dp[n]。
Sample Input
3
1
7
1000
Sample Output
4
445
1666
同余+找规律。需要动脑想一想。
题解……改天补上好了。
#include<stdio.h>
int dp[100001];
int main()
{
int i,k,j;
dp[0]=1;
for(i=1,k=1,j=1;i<100001;i++)
{
if(k<2333)
dp[i]=(k+(j*3)%2333)%2333;
k=(k*2)%2333;
j=(j*2+1)%2333;
}
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
printf("%d\n",dp[n]);
}
return 0;
}