您的位置:首页 > 其它

HDU_2256_Problem of Precision

2016-03-22 21:10 423 查看

Problem of Precision

[align=center]Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1159    Accepted Submission(s): 688

[/align]

归纳推理+矩阵快速幂;
[align=left]Problem Description[/align]



 
推理过程(引用大牛的):

1 题目要求的是(sqrt(2)+sqrt(3))^2n %1024向下取整的值

 


 


3 这里很多人会直接认为结果等于(an+bn*sqrt(6))%1024,但是这种结果是错的,因为这边涉及到了double,必然会有误差,所以根double有关的取模都是错误的思路

 

[align=left]Input[/align]
The first line of input gives the number of cases, T. T test cases follow, each on a separate line. Each test case contains one positive integer n. (1 <= n <= 10^9)

 

[align=left]Output[/align]
For each input case, you should output the answer in one line.

 

[align=left]Sample Input[/align]

3
1
2
5

 

[align=left]Sample Output[/align]

9
97
841

 

[align=left]Source[/align]
HDOJ 2008 Summer Exercise(4)- Buffet Dinner

 

[align=left]Recommend[/align]
lcy   |   We have carefully selected several similar problems for you:  3117 2254 1588 2294 2276 
 

Statistic | Submit | Discuss
| Note

#include <iostream>
#include<string>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<cstring>
using namespace std;
const int N=1e6+7;
struct Matrix
{
int x,y;
int A[10][10];
void Clean()
{
x=y=0;
memset(A,0,sizeof(A));
}
Matrix operator *(const Matrix& B)const
{
Matrix tmp;
tmp.Clean();
tmp.x=x,tmp.y=B.y;
for(int i=0;i<x;i++)
{
for(int j=0;j<B.y;j++)
{
for(int k=0;k<x;k++)
{
(tmp.A[i][j]+=A[i][k]*B.A[k][j])%=1024;
}
}
}
return tmp;
}
}S,ans;
int power(int n)
{
ans.Clean();
ans.x=2;
ans.y=1;
ans.A[0][0]=5;
ans.A[1][0]=2;
S.Clean();
S.x=S.y=2;
S.A[0][0]=5;
S.A[0][1]=12;
S.A[1][0]=2;
S.A[1][1]=5;
while(n)
{
if(n&1)
ans=S*ans;
S=S*S;
n>>=1;
}
return (ans.A[0][0]*2-1)%1024;
}
int main()
{
int n;
int t;
cin>>t;
while(t--)
{cin>>n;
printf("%d\n",power(n-1));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: