用前缀和来求区间和,然后用一个二重循环穷举,但是因为问题规模为100000,所以超时(28分)
超时代码:
#include <stdio.h> #include <memory.h> #include <math.h> #include <string> #include <string.h> #include <vector> #include <set> #include <stack> #include <queue> #include <algorithm> #include <map> #define I scanf #define OL puts #define O printf #define F(a,b,c) for(a=b;a<c;a++) #define FF(a,b) for(a=0;a<b;a++) #define FG(a,b) for(a=b-1;a>=0;a--) #define LEN 100010 #define MAX 0x06FFFFFF #define V vector<int> #define ll long long using namespace std; ll sum[LEN]; int main(){ // freopen("D:/CbWorkspace/blue_bridge/k倍区间.txt","r",stdin); int i,j,n,k,ans=0; I("%d%d",&n,&k); FF(i,n){ I("%d",&j); sum[i+1]=sum[i]+j; } for(i=1;i<=n;i++){ for(j=i;j<=n;j++){ int t=(sum[j]-sum[i-1]); if((sum[j]-sum[i-1])%k==0) ans++; } } printf("%d\n",ans); return 0; }