HDU 2604Queuing(矩阵快速幂)
2017-02-09 16:02
232 查看
如有错误,欢迎大神指出!!!
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5147 Accepted Submission(s): 2277
Problem Description
Queues and Priority Queues are data structures which are known to most computer scientists. The Queue occurs often in our daily life. There are many people lined up at the lunch time.
Now we define that ‘f’ is short for female and ‘m’ is short for male. If the queue’s length is L, then there are 2L numbers of queues. For example, if L = 2, then they are ff, mm, fm, mf . If there exists a subqueue as fmf or fff, we call it O-queue
else it is a E-queue.
Your task is to calculate the number of E-queues mod M with length L by writing a program.
Input
Input a length L (0 <= L <= 10 6) and M.
Output
Output K mod M(1 <= M <= 30) where K is the number of E-queues with length L.
Sample Input
3 8
4 7
4 8
Sample Output
6
2
1
Author
WhereIsHeroFrom
Source
HDU 1st “Vegetable-Birds Cup” Programming
Open Contest
Recommend
lcy | We have carefully selected several similar problems for you: 1588 1757 2606 2276 2603
题意:n个人进行男女排队,如果是fmf,或者fff就 不符合条件,计算有多少符合条件的序列并且取余M。
题解:可以用递推或者矩阵。
首先,假设n个人符合条件的序列为f(n),若最后一个人是女性m,那么f(n)=f(n-1),若是男性f则进一步讨论;
看最后三个人(n-3) 有mmf,mff,fmf,fff,四种可能,其中fmf和fff不符合。
若是mmf那么f(n)=f(n-3),若是mff则需要在看前一位只有mmff才符合所以f(n)=f(n-4);
将所有的可能加起来得到 f(n)=f(n-1)+f(n-3)+f(n-4);
构造矩阵
剩下的看代码……
ac code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <list>
#include <deque>
#include <queue>
#include <iterator>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <cctype>
#define si1(a) scanf("%d",&a)
#define si2(a,b) scanf("%d%d",&a,&b)
#define sd1(a) scanf("%lf",&a)
#define sd2(a,b) scanf("%lf%lf",&a,&b)
#define ss1(s) scanf("%s",s)
#define pi1(a) printf("%d\n",a)
#define pi2(a,b) printf("%d %d\n",a,b)
#define mset(a,b) memset(a,b,sizeof(a))
#define forb(i,a,b) for(int i=a;i<b;i++)
#define ford(i,a,b) for(int i=a;i<=b;i++)
#define LL long long
#define eps 1e-8
#define INF 0x3f3f3f3f
#define mod 1000000007
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
using namespace std;
int num[5][2];
struct Matrix
{
int m[4][4];
}E,A;
void init()
{
mset(E.m,0);
for(int i=0;i<4;i++)
E.m[i][i]=1;
mset(A.m,0);
A.m[0][0]=A.m[1][0]=A.m[2][1]=A.m[3][2]=A.m[0][2]=A.m[0][3]=1;
num[0][0]=9;num[1][0]=6;num[2][0]=4;num[3][0]=2;
return ;
}
Matrix Mul(Matrix a,Matrix b,int M)
{
Matrix ans;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
ans.m[i][j]=0;
for(int k=0;k<4;k++)
{
ans.m[i][j]=(ans.m[i][j]+a.m[i][k]*b.m[k][j])%M;
}
}
}
return ans;
}
Matrix quick(Matrix a,int k,int M)
{
Matrix t=a,d=E;
while(k)
{
if(k&1)
d=Mul(d,t,M);
k>>=1;
t=Mul(t,t,M);
}
return d;
}
int main()
{
int n,M;
init();
while(~si2(n,M))
{
if(n<=4)
{
printf("%d\n",(num[4-n][0])%M);
continue;
}
Matrix ans=quick(A,n-4,M);
int sum=0;
for(int i=0;i<4;i++)
{
sum+=(ans.m[0][i]*num[i][0])%M;
}
printf("%d\n",sum%M);//这里需要进一步取余,错了两发才发现……
Queuing
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5147 Accepted Submission(s): 2277
Problem Description
Queues and Priority Queues are data structures which are known to most computer scientists. The Queue occurs often in our daily life. There are many people lined up at the lunch time.
Now we define that ‘f’ is short for female and ‘m’ is short for male. If the queue’s length is L, then there are 2L numbers of queues. For example, if L = 2, then they are ff, mm, fm, mf . If there exists a subqueue as fmf or fff, we call it O-queue
else it is a E-queue.
Your task is to calculate the number of E-queues mod M with length L by writing a program.
Input
Input a length L (0 <= L <= 10 6) and M.
Output
Output K mod M(1 <= M <= 30) where K is the number of E-queues with length L.
Sample Input
3 8
4 7
4 8
Sample Output
6
2
1
Author
WhereIsHeroFrom
Source
HDU 1st “Vegetable-Birds Cup” Programming
Open Contest
Recommend
lcy | We have carefully selected several similar problems for you: 1588 1757 2606 2276 2603
题意:n个人进行男女排队,如果是fmf,或者fff就 不符合条件,计算有多少符合条件的序列并且取余M。
题解:可以用递推或者矩阵。
首先,假设n个人符合条件的序列为f(n),若最后一个人是女性m,那么f(n)=f(n-1),若是男性f则进一步讨论;
看最后三个人(n-3) 有mmf,mff,fmf,fff,四种可能,其中fmf和fff不符合。
若是mmf那么f(n)=f(n-3),若是mff则需要在看前一位只有mmff才符合所以f(n)=f(n-4);
将所有的可能加起来得到 f(n)=f(n-1)+f(n-3)+f(n-4);
构造矩阵
剩下的看代码……
ac code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <list>
#include <deque>
#include <queue>
#include <iterator>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <cctype>
#define si1(a) scanf("%d",&a)
#define si2(a,b) scanf("%d%d",&a,&b)
#define sd1(a) scanf("%lf",&a)
#define sd2(a,b) scanf("%lf%lf",&a,&b)
#define ss1(s) scanf("%s",s)
#define pi1(a) printf("%d\n",a)
#define pi2(a,b) printf("%d %d\n",a,b)
#define mset(a,b) memset(a,b,sizeof(a))
#define forb(i,a,b) for(int i=a;i<b;i++)
#define ford(i,a,b) for(int i=a;i<=b;i++)
#define LL long long
#define eps 1e-8
#define INF 0x3f3f3f3f
#define mod 1000000007
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
using namespace std;
int num[5][2];
struct Matrix
{
int m[4][4];
}E,A;
void init()
{
mset(E.m,0);
for(int i=0;i<4;i++)
E.m[i][i]=1;
mset(A.m,0);
A.m[0][0]=A.m[1][0]=A.m[2][1]=A.m[3][2]=A.m[0][2]=A.m[0][3]=1;
num[0][0]=9;num[1][0]=6;num[2][0]=4;num[3][0]=2;
return ;
}
Matrix Mul(Matrix a,Matrix b,int M)
{
Matrix ans;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
ans.m[i][j]=0;
for(int k=0;k<4;k++)
{
ans.m[i][j]=(ans.m[i][j]+a.m[i][k]*b.m[k][j])%M;
}
}
}
return ans;
}
Matrix quick(Matrix a,int k,int M)
{
Matrix t=a,d=E;
while(k)
{
if(k&1)
d=Mul(d,t,M);
k>>=1;
t=Mul(t,t,M);
}
return d;
}
int main()
{
int n,M;
init();
while(~si2(n,M))
{
if(n<=4)
{
printf("%d\n",(num[4-n][0])%M);
continue;
}
Matrix ans=quick(A,n-4,M);
int sum=0;
for(int i=0;i<4;i++)
{
sum+=(ans.m[0][i]*num[i][0])%M;
}
printf("%d\n",sum%M);//这里需要进一步取余,错了两发才发现……
} return 0; }
相关文章推荐
- hdu_2604Queuing(快速幂矩阵)
- 【矩阵快速幂】hdu 1757
- HDU 2807 The Shortest Path【矩阵的快速比较】
- hdu 2157 (K步路+矩阵快速幂)
- HDU 4565——So Easy!(矩阵快速幂乘法)
- HDU4549M-斐波那契数列(矩阵快速幂,二分幂)
- 【矩阵快速幂】hdu 1575
- hdu-4471-Homework-矩阵快速幂+优化加速
- HDU 1005 矩阵的快速二分幂
- hdu 3411 推公式+矩阵快速幂
- hdu 1575 (矩阵快速幂)
- hdu 2232 机器人的舞蹈 矩阵快速幂
- 数和矩阵快速幂hdu 3493
- HDU 4291:A Short problem_成都赛区网络赛—矩阵快速幂
- hdu 4291 矩阵快速幂+循环节
- hdu 1575 矩阵快速幂
- hdu 2254 奥运(矩阵快速幂)
- hdu 1575 Tr A(矩阵乘法快速求幂)
- HDU 4549 M斐波那契数列(矩阵快速幂+欧拉定理)
- hdu-4471-Homework-矩阵快速幂+优化加速