题目描述
输入N个整数的数组A,然后又M个询问。每个询问给2个整数a和b,问数组的第a个到第b个的和能被11整除吗?如果能输出1,否则输出0。
输入格式
第一行2个正整数:N和M,N、M的范围在[1,100000]。
第二行N个正整数:范围在[1,100]。
下面有M行,每行2个整数a和b,a、b的范围在[1,N]。
输出格式
M个整数,每个数一行,对应M个询问。
输入/输出例子1
输入:
5 2
3 6 2 7 9
1 3
3 4
输出:
1
0
知识点
前缀和的进一步加深训练
任务1
1:用long long 存储原数组,数组数据个数;
2:for循环输入原数组
3:输入指定范围个数
3:for循环输入指定范围
4:从范围的初始数值到范围的结束判断数值是否11的倍数,进行累加
5:输出累加的答案
#include<bits/stdc++.h>
using namespace std;
long long n,q,a[100002],b[100002],x,y,sum=0;
int main()
{
cin>>n>>q;
for(long long i=1; i<=n; i++)
{
scanf("%lld",&a[i]);
}
for(long long i=1; i<=q; i++)
{
sum=0;
scanf("%lld%lld",&x,&y);
if(x>y) swap(x,y);
for(long long j=x; j<=y; i++) sum=sum+a[i];
if(sum%11==0) cout<<1;
else cout<<0;
}
return 0;
}
超时*********我c***********
正确写法
#include<bits/stdc++.h>
using namespace std;
long long n,q,a[100002],b[100002],x,y,sum=0;
int main()
{
cin>>n>>q;
for(long long i=1; i<=n; i++)
{
scanf("%lld",&a[i]);
b[i]=b[i]+b[i-1]+a[i];
}
for(long long i=1; i<=q; i++)
{
sum=0;
scanf("%lld%lld",&x,&y);
if(x>y) swap(x,y);
sum=sum+b[y]-b[x-1];
if(sum%11==0){printf("1");cout<<endl;}
else if(sum%11!=0){printf("0");cout<<endl;}
}
return 0;
}