标签:etc getchar font targe The 不为 using get contest
时间限制:1 Sec 内存限制:128 MiB
提交:179
答案正确:34
4 5--4 1--1,1--2 2--4,2--2,2--3 1--4,1--3,1--2,1--1
15 1 3 3
打表查一下4的倍数的数字会发现规律,对于个位数,只有4/8是4的倍数,对于多位数,如果个位是奇数那他不可能是4的倍数,
如果
个位数是0/4/8,那十位数只有是偶数,这个数才是4的倍数;如果个位数是2/6那么十位数只有是奇数这个数才是4的倍数。
知道规律就简单了,记录下pre表示前面几段有多少个数字,枚举一下当前段的数字,奇数不管,2/6就加上pre,4/8根据前面的
数的奇偶性分情况讨论一下。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define LL long long #define uint unsigned int LL a[110],b[110]; char s[110]; int main() { int i,j,k,t; scanf("%d",&t); getchar(); while(t--){ int tot=0; gets(s); LL ans=0,pre=0; LL n=strlen(s),tmp=0; s[n]=‘,‘; for(i=0;i<=n;++i){ if(isdigit(s[i])){ tmp=tmp*10+(s[i]-‘0‘); } else if(s[i]==‘-‘){ i++; tot++; a[tot]=tmp; tmp=0; } else if(s[i]==‘,‘){ b[tot]=tmp; tmp=0; } } for(i=1;i<=tot;++i){ if(b[i]==2||b[i]==6){ if(b[i-1]%2==1){ ans+=pre; } } else if(b[i]==4||b[i]==8){ if(b[i-1]%2==0){ ans+=a[i]*(pre+pre+a[i]+1)/2; } else{ ans+=a[i]*(pre+pre+a[i]+1)/2; ans=ans-pre; } } pre+=a[i]; } cout<<ans<<endl; } return 0; }
标签:etc getchar font targe The 不为 using get contest
原文地址:https://www.cnblogs.com/yi-ye-zhi-qiu/p/9065278.html