[关闭]
@994495jj 2017-05-31T11:46:31.000000Z 字数 3013 阅读 902

华中农业大学第五届程序设计大赛

(ACM)动态规划 (ACM)数学----fib数列 (ACM)数学----矩阵快速幂



contest

A. Little Red Riding Hood(dp)

题意

题解

代码

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <vector>
  5. #include <cstdio>
  6. #include <string>
  7. #include <cmath>
  8. #include <queue>
  9. #include <set>
  10. #include <map>
  11. using namespace std;
  12. typedef long long ll;
  13. typedef unsigned long long ull;
  14. typedef pair<int,int> pii;
  15. typedef pair<ll,ll> pll;
  16. #define mp make_pair
  17. #define pb push_back
  18. #define fi first
  19. #define se second
  20. #define lson l,m,rt<<1
  21. #define rson m+1,r,rt<<1|1
  22. #define de(x) cout << #x << "=" << x << endl
  23. const int N=100005;
  24. int a[N];
  25. ll Max[N],dp[N];
  26. int main() {
  27. int T;scanf("%d",&T);
  28. int ca=0;
  29. while(T--) {
  30. ///init
  31. memset(Max,0,sizeof(Max));
  32. memset(dp,0,sizeof(dp));
  33. ///read
  34. int n,k;scanf("%d%d",&n,&k);
  35. for(int i=1;i<=n;++i) scanf("%d",a+i);
  36. ///solve
  37. for(int i=1;i<=n;++i) {
  38. int pre=i-k-1;
  39. pre=max(0,pre);
  40. dp[i]=Max[pre]+a[i];
  41. Max[i]=max(Max[i-1],dp[i]);
  42. }
  43. ///print
  44. cout<<Max[n]<<endl;
  45. }
  46. return 0;
  47. }

C. Friends(dp思想)

题意

题解

代码

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <vector>
  5. #include <cstdio>
  6. #include <string>
  7. #include <cmath>
  8. #include <queue>
  9. #include <set>
  10. #include <map>
  11. using namespace std;
  12. typedef long long ll;
  13. typedef unsigned long long ull;
  14. typedef pair<int,int> pii;
  15. typedef pair<ll,ll> pll;
  16. #define mp make_pair
  17. #define pb push_back
  18. #define fi first
  19. #define se second
  20. #define lson l,m,rt<<1
  21. #define rson m+1,r,rt<<1|1
  22. #define de(x) cout << #x << "=" << x << endl
  23. const int N=100005;
  24. vector<int> G[N];
  25. int fa[N],son[N][7],ans[N];
  26. void dfs1(int u,int pre) {
  27. ///
  28. fa[u]=pre;
  29. son[u][0]=1;
  30. ///
  31. int sz=G[u].size();
  32. for(int i=0;i<sz;++i) {
  33. int v=G[u][i];
  34. if(v==pre) continue;
  35. ///
  36. dfs1(v,u);
  37. for(int j=1;j<=6;++j) son[u][j]+=son[v][j-1];
  38. }
  39. }
  40. void dfs2(int u) {
  41. for(int i=1;i<=6;++i) ans[u]+=son[u][i];
  42. int pre=u,now=u;
  43. for(int i=1;i<=6;++i) {
  44. now=pre;
  45. pre=fa[pre];
  46. if(!pre) break;
  47. for(int j=0;j<=6-i;++j) {
  48. ans[u]+=son[pre][j];
  49. if(j) ans[u]-=son[now][j-1];
  50. }
  51. }
  52. }
  53. int main() {
  54. int T;scanf("%d",&T);
  55. int ca=0;
  56. while(T--) {
  57. printf("Case #%d:\n",++ca);
  58. ///init
  59. for(int i=0;i<N;++i) G[i].clear();
  60. memset(son,0,sizeof(son));
  61. memset(ans,0,sizeof(ans));
  62. ///read
  63. int n;scanf("%d",&n);
  64. for(int i=1;i<n;++i) {
  65. int u,v;scanf("%d%d",&u,&v);
  66. G[u].pb(v);
  67. G[v].pb(u);
  68. }
  69. ///solve
  70. dfs1(1,0);
  71. for(int i=1;i<=n;++i) dfs2(i);
  72. ///print
  73. for(int i=1;i<=n;++i) printf("%d\n",ans[i]);
  74. }
  75. return 0;
  76. }

D. GCD(fib数列+矩阵快速幂)

题意

题解

代码

  1. #include<cstdio>
  2. #include<cstring>
  3. int n,m,p;
  4. int gcd(int a,int b) {
  5. if(b==0) return a;
  6. return gcd(b,a%b);
  7. }
  8. struct Mat {
  9. int mat[3][3];
  10. Mat() {memset(mat,0,sizeof(mat));}
  11. Mat operator * (Mat B) {
  12. Mat C;
  13. for(int i=1;i<=2;++i) {
  14. for(int j=1;j<=2;++j) {
  15. for(int k=1;k<=2;++k) {
  16. C.mat[i][j]=(C.mat[i][j]+1ll*mat[i][k]*B.mat[k][j]%p)%p;
  17. }
  18. }
  19. }
  20. return C;
  21. }
  22. };
  23. Mat powmul(Mat A,int k) {
  24. Mat B;
  25. B.mat[1][1]=B.mat[2][2]=1;
  26. while(k) {
  27. if(k&1) B=B*A;
  28. A=A*A;
  29. k>>=1;
  30. }
  31. return B;
  32. }
  33. int main() {
  34. int T;scanf("%d",&T);
  35. while(T--) {
  36. ///
  37. scanf("%d%d%d",&n,&m,&p);
  38. ///get d
  39. int d=gcd(n+2,m+2);
  40. ///get fib[d]
  41. Mat A;
  42. A.mat[1][1]=A.mat[1][2]=A.mat[2][1]=1;
  43. A=powmul(A,d);
  44. printf("%d\n",A.mat[1][2]);
  45. }
  46. return 0;
  47. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注