Codeforces Round #191 (Div. 2)
2013-07-06 19:13
411 查看
知道有比赛,可是忘记报名了,坑啊
好吧,就三题会做
327A Flipping Games
给定一由0、1组成的串,改变某个区间所有元素的状态(0→1、1→0),要求使改变后的元素含1最多,并输出1的个数:
考预处理的吧,用两个数组分别记录到从 0 到 i 这个位置,一共有多少个0或者1,那么区间 i ~ j 之间1的个数就是 is1[ j ] - is1[ i - 1]。
327B hungry sequence
小学数学题,只要读题仔细点就OK。
题意是求一个递增数列,使得数列中任意两个元素都不能被对方整除,而数列长度10^5 ,数据的取值确实10^7,那么只要在10^5后面任意位置取要求长度的连续整数就OK了。
327C magic five
给定一个长度不超过10^5的数,删掉若干个之后使其能被5整除,求有多少种方法,可以有第一个数字是0的情况,但是不能全部删掉!
等比数列求和吧,因为数据很大,结果要mod 10^9+7,所以不能直接用等比数列求和公式,因为不能边除边MOD。
设项数为a[ i ]前N项的和为S(N),我们可以发现:
a[ 1 ]*q^(n/2)=a[ n/2+1 ]
a[ 2 ]*q^(n/2)=a[ n/2+2 ]
......
a[ n/2 ]*q(n/2)=a[ n ]
即T(n/2)*q^(n/2)=T(n/2~n)。
所以T(n)=T(n/2)+T(n/2)*q^(n/2),当然要讨论奇偶,如果是奇数则还要加上a(n)。
好吧,就三题会做
327A Flipping Games
给定一由0、1组成的串,改变某个区间所有元素的状态(0→1、1→0),要求使改变后的元素含1最多,并输出1的个数:
考预处理的吧,用两个数组分别记录到从 0 到 i 这个位置,一共有多少个0或者1,那么区间 i ~ j 之间1的个数就是 is1[ j ] - is1[ i - 1]。
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int main() { int is0[101],is1[101],n,ans,a[101],max,i,j,k; while (scanf("%d",&n)!=EOF) { is0[0]=0;is1[0]=0; for (i=1;i<=n;i++) { scanf("%d",&a[i]); if (a[i]==0) is0[i]=is0[i-1]+1,is1[i]=is1[i-1]; else is1[i]=is1[i-1]+1,is0[i]=is0[i-1]; } ans=0; for (i=1;i<=n;i++) { max=0; for (j=i;j<=n;j++) { int num0; num0=is0[j]-is0[i-1]; if (is1[i-1]+num0+is1 -is1[j]>max) max=is1[i-1]+num0+is1 -is1[j]; } if (ans<max) ans=max; } printf("%d\n",ans); } return 0; }
327B hungry sequence
小学数学题,只要读题仔细点就OK。
题意是求一个递增数列,使得数列中任意两个元素都不能被对方整除,而数列长度10^5 ,数据的取值确实10^7,那么只要在10^5后面任意位置取要求长度的连续整数就OK了。
#include<iostream> #include<stdio.h> using namespace std; int main() { int n,i; while (scanf("%d",&n)!=EOF) { for (i=1;i<n;i++) printf("%d ",1000000+i); printf("%d\n",1000000+i); } return 0; }
327C magic five
给定一个长度不超过10^5的数,删掉若干个之后使其能被5整除,求有多少种方法,可以有第一个数字是0的情况,但是不能全部删掉!
等比数列求和吧,因为数据很大,结果要mod 10^9+7,所以不能直接用等比数列求和公式,因为不能边除边MOD。
设项数为a[ i ]前N项的和为S(N),我们可以发现:
a[ 1 ]*q^(n/2)=a[ n/2+1 ]
a[ 2 ]*q^(n/2)=a[ n/2+2 ]
......
a[ n/2 ]*q(n/2)=a[ n ]
即T(n/2)*q^(n/2)=T(n/2~n)。
所以T(n)=T(n/2)+T(n/2)*q^(n/2),当然要讨论奇偶,如果是奇数则还要加上a(n)。
#include<iostream> #include<stdio.h> #include<string.h> #define ll __int64 #define oo 1000000007 using namespace std; int a[100010]; ll pow(ll k) { if (k==0) return 1; if (k==1) return 2; ll tmp; tmp=pow(k/2); if (k%2) return (tmp*tmp%oo)*2%oo; //cout<<tmp*tmp%oo<<' '; return tmp*tmp%oo; } ll solved(ll ans,ll k,ll m) { ll tmp,temp; if (k==1) return ans; tmp=solved(ans,k/2,m)%oo; temp=tmp*pow(m*(k/2))%oo; if (k%2) return ((tmp+temp)%oo+ans*pow(m*(k-1))%oo)%oo; return (tmp+temp)%oo; } int main() { ll k,len,i,j,ans; a[0]=1; for (i=1;i<100001;i++) a[i]=a[i-1]*2%oo; char str[100010]; while (scanf("%s",str)!=EOF) { scanf("%I64d",&k); len=strlen(str); ans=0; for (i=0;i<len;i++) { if (str[i]=='0'||str[i]=='5') ans=(ans+a[i])%oo; } //cout<<ans<<endl; printf("%I64d\n",solved(ans,k,len)%oo); } return 0; }
相关文章推荐
- Codeforces Round #191 (Div. 2) 解题报告
- Codeforces Round #191 (Div. 2) A. Flipping Game(简单)
- Codeforces Round #191 (Div. 2) C. Magic Five(数学,逆元取膜模板)
- Codeforces Round #191 (Div. 2) ABCD
- Codeforces Round #191 (Div. 2) 解题报告
- Codeforces Round #191 (Div. 2) D. Block Tower
- Codeforces Round #191 (Div. 2) C. Magic Five
- Codeforces Round #191 (Div. 2)---A. Flipping Game
- Codeforces Round #191 (Div. 2) D
- Codeforces Round #191 (Div. 2)-A. Flipping Game
- Codeforces Round #191 (Div. 2)
- Codeforces Round #191 (Div. 2) E. Axis Walking (状态压缩+lowbit应用)
- Codeforces Round #191 (Div. 2) E题
- Codeforces Round #202 (Div. 1) (树形dp, dp)
- Codeforces Round #277.5 (Div. 2)C. Given Length and Sum of Digits...(贪心)
- Codeforces Round #262 (Div. 2) 1003
- Codeforces Round #334 (Div. 2)
- Codeforces Round #410 (Div. 2) A
- Codeforces Round #278 (Div. 1) C. Prefix Product Sequence 模逆元,构造 2017/1/25
- codeforces Round 211 Div 2部分题解(持续更新中.......)