首页 > 代码库 > HDU 4990 Reading comprehension(找规律+矩阵快速幂)
HDU 4990 Reading comprehension(找规律+矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4990
Problem Description
Read the program below carefully then answer the question.
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include<iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include<vector>
const int MAX=100000*2;
const int INF=1e9;
int main()
{
int n,m,ans,i;
while(scanf("%d%d",&n,&m)!=EOF)
{
ans=0;
for(i=1;i<=n;i++)
{
if(i&1)ans=(ans*2+1)%m;
else ans=ans*2%m;
}
printf("%d\n",ans);
}
return 0;
}
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include<iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include<vector>
const int MAX=100000*2;
const int INF=1e9;
int main()
{
int n,m,ans,i;
while(scanf("%d%d",&n,&m)!=EOF)
{
ans=0;
for(i=1;i<=n;i++)
{
if(i&1)ans=(ans*2+1)%m;
else ans=ans*2%m;
}
printf("%d\n",ans);
}
return 0;
}
Input
Multi test cases,each line will contain two integers n and m. Process to end of file.
[Technical Specification]
1<=n, m <= 1000000000
[Technical Specification]
1<=n, m <= 1000000000
Output
For each case,output an integer,represents the output of above program.
Sample Input
1 10 3 100
Sample Output
1 5
Source
BestCoder Round #8
思路:
先用源程序跑几个数出来!1, 2, 5, 10, 21, 42 好了,再用这几个数字找他们的通项式(我是在http://oeis.org/(队友告诉我的)找的);
然后再用矩阵快速幂就OK!
代码如下:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define LL __int64 struct Matrix { LL m[5][5]; } I,A,B,T; LL a,b,n, mod; int ssize = 3; Matrix Mul(Matrix a,Matrix b) { int i,j,k; Matrix c; for (i = 1; i <= ssize; i++) { for(j = 1; j <= ssize; j++) { c.m[i][j]=0; for(k = 1; k <= ssize; k++) { c.m[i][j]+=(a.m[i][k]*b.m[k][j]); c.m[i][j]%=mod; } } } return c; } Matrix quickpagow(int n) { Matrix m=A, b=I; while(n) { if(n&1) b=Mul(b,m); n=n>>1; m=Mul(m,m); } return b; } int main() { while(~scanf("%I64d%I64d",&n,&mod)) { memset(I.m,0,sizeof(I.m)); memset(A.m,0,sizeof(A.m)); memset(B.m,0,sizeof(B.m)); for(int i = 1; i <= ssize; i++) { I.m[i][i]=1; } B.m[1][1] = 1, B.m[1][2] = 2, B.m[1][3] = 1; A.m[1][2] = 2; A.m[2][1]=A.m[2][2]=A.m[3][2]=A.m[3][3]=1; if(n==1) { printf("%I64d\n",1%mod); continue; } if(n==2) { printf("%I64d\n",2%mod); continue; } T = quickpagow(n-2); T = Mul(B,T); printf("%I64d\n",T.m[1][2]%mod); } return 0; }
HDU 4990 Reading comprehension(找规律+矩阵快速幂)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。