校赛1007题的经典解法

Problem Description
Payne和Quincy是一对好Basefriend,即使在“六一光棍节”这天,寂寞无聊的Payne决定调戏一下Quincy。
他在一张纸上写下了一串数字,然后来到Quincy面前。
“嗨,Quincy,我看你也挺无聊的,来验证一下你的智商吧。”
“噢,Payne,你又有什么鬼主意了?”
“嘿,听一听吧,会很有趣的!”
“嗯,那你说吧。”
“哈,听着,你看这里有一串数。我们从中取一段连续的数字,比如你看这的1357902468147258369,我们从中取出一段长度为7的子串,可以是5790246,或者是0246814。这样我们就得到了一些新的数。然后,让我们看看长度为7的所有子串所表示的数里面,共有多少个数是9的倍数。”
“哼,多简单的游戏啊。小孩都会算。”
“呵,那咱俩来试试?我写一个数,你来告诉我答案?”

Input
一个正整数T(1 ≤ T ≤ 100),表示有T组数据。
以下每组数据各有两行输入
第一行包含两个正整数N,M(1 ≤ N ≤ 10^6,1 ≤ M ≤ 10^3),表示母串长度为N,子串长度为M。
第二行包含一个大数,大数按十进制表示,共有N位。

Output
每组数据输出一行,包含一个数,表示母串中所有长度为M的子串中,为9的倍数的个数
Sample Input
2 3 2 181 5 3 18171
Sample Output
2 1 #include<stdio.h>#define MAXN 1000000
int t;
main()
{ int i,j,k,count; long n,m,aa; char a[MAXN]; scanf("%d",&t); for(i=0;i<t;i++) {  scanf("%d%d",&n,&m);  scanf("%s",a);  count=0;  for(j=0;j+m<=n;j++)         {                 if(j==0)                 {                  aa=0;                      for(k=0;k<m;k++)                            aa+=a[k]-'0';                 }else                    {                                aa-=a[j-1]-'0';                                aa+=a[j+m-1]-'0';                 }                        if(!(aa%9))                         count++;         }        printf("%d\n",count); } system("pause"); return 0;}
原文地址:https://www.cnblogs.com/chaosheng/p/2329587.html