2. 小信的无限数组
题目ID:20679必做题100分
最新提交:
Runtime Error
10 分
历史最高:
Runtime Error
10 分
时间限制: 2000ms
空间限制: 262144kB
题目描述
小信有一个长度为n的数组 ,他现在把这个数组不断地往后拼接,形成一个以n个元素为周期的长度无限的数组
小信想要知道是否存在一个连续的子数组使得这个子数组的和为S。
输入格式
第一行输入一个整数t(1≤t≤10),表示测试数据的组数。
对于每组测试数据,第一行输入两个整数n和S分别表示数组的长度和要求子数组和的大小。
第二行输入n个整数
输出格式
对于每组测试数据,如果合法输出一行Yes,否则输出一行No。
样例
Input 1
3
3 42
3 8 4
3 1
3 8 4
20 83298426
748 169 586 329 972 529 432 519 408 587 138 249 656 114 632 299 984 755 404 772
Output 1
Yes
No
Yes
样例解释
对于第一组测试数据,无限的数组为(3,8,4,3,8,4,...),小信可以选择(a2,a3,a4,a5,a6,a7,a8,a9)=(8,4,3,8,4,3,8,4),总和为42,所以结果是Yes。
my code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int T;
cin>>T;
while(T--){
ll k,n,sum[200005]={0},now=0;
cin>>n>>k;
for(ll i=1;i<=n;i++){
ll x;
cin>>x;
sum[i]=sum[i-1]+x;
}
ll c=k%sum[n],f=0;
for(ll i=n+1;i<=2*n;i++){
sum[i]=sum[i-n]+sum[n];
}
for(ll i=1;i<=2*n;i++){
if(sum[i]-sum[now]==c){
f=1;
cout<<"Yes"<<endl;
break;
}
if(sum[i]-sum[now]>c){
now++;
i--;
}
}
if(f==0){
cout<<"No"<<endl;
}
}
return 0;
}
蒟蒻求助!