哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
Posted 多一份不为什么的坚持
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解相关的知识,希望对你有一定的参考价值。
提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5
1470-1482
只做出来四道比较水的题目,还需要加强中等题的训练。
题解:
E666
这个题是让求有多少个子串只含有6。寻找连续的6,然后用n*(n+1)/2求出这一段的子串个数,然后把每一段连续的加起来。
做的时候wa了很多次,原来是在n*(n+1)的地方已经超过int型了,所以需要设置类型为long long。
#include <cstdio> #include <iostream> #include <cstring> using namespace std; int T,N; char s[200005]; long long sum; long long int tag; int main() { scanf("%d",&T); while(T--) { sum=0; tag=0; scanf("%d",&N); scanf("%s",s); for(int i=0;i<N;i++) { if(s[i]==\'6\') { t ag++; } else { sum=sum+(tag*(tag+1))/2; tag=0; } } long long int tt=tag*(tag+1)/2; sum+=tt; printf("%lld\\n",sum); } return 0; }
H Blocks
队友看的这个题,说是裸地斐波那契数列,正好做过矩阵快速幂的于是就粘上了。
#include <iostream> #include <cstdio> #include <cstring> #define mod 1000000007 using namespace std; struct matrix{ long long int m[2][2]; }; matrix base,ans; void init(int n){//Ö»³õʼ»¯baseºÍans(µ¥Î»¾ØÕó) memset(base.m,0,sizeof(base.m)); memset(ans.m,0,sizeof(ans.m)); for(int i=0;i<2;i++){ ans.m[i][i]=1; } base.m[0][0]=base.m[0][1]=base.m[1][0]=1; } matrix multi(matrix a,matrix b){ matrix t; for(int i=0;i<2;i++){ for(int j=0;j<2;j++){ t.m[i][j]=0; for(int k=0;k<2;k++){ t.m[i][j]=(t.m[i][j]+a.m[i][k]*b.m[k][j])%mod; } } } return t; } long long int fast_matrix(long long int n){ while(n){ if(n&1){ ans=multi(ans,base); } base=multi(base,base); n>>=1; } return ans.m[1][0]; } int main() { long long int n; while(~scanf("%lld",&n) && n!=0){ init(n+1); printf("%lld\\n",fast_matrix(n+1)); } return 0; }
J Odd number
最水的一个题,求奇数个数。
#include <iostream> #include <cstdio> using namespace std; int main(){ int n; int ans; long long t; while(~scanf("%d",&n)){ ans=0; for(int i=0;i<n;i++){ scanf("%lld",&t); if(t%2==1){ ans++; } } printf("%d\\n",ans); } return 0; }
K Candy
糖果题,队友说就一个求n的m次方,只不过数非常大,这不就是快速幂吗!
#include <iostream> #include <cstdio> #define MOD2 1000000007 using namespace std; int T; int m,n; long long int rel; long long int fast_power(long long int a,long long int n){ long long int ans=1,p=a; while(n){ if(n&1){ ans=((ans%MOD2)*(p%MOD2))%MOD2; } n>>=1; p=((p%MOD2)*(p%MOD2))%MOD2; } return ans; } int main() { scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); rel=fast_power(m,n); printf("%lld\\n",rel); } return 0; }
以上是关于哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解的主要内容,如果未能解决你的问题,请参考以下文章