首页 > 代码库 > 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
哈尔滨理工大学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){//??3?ê??ˉbaseoí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全国邀请赛(网络同步赛)题解
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。