30,414
社区成员




给定一个长度为 n� 的数组 a1,a2,…,an�1,�2,…,��。
现在,要将该数组从中间截断,得到三个非空子数组。
要求,三个子数组内各元素之和都相等。
请问,共有多少种不同的截断方法?
输入格式
第一行包含整数 n�。
第二行包含 n� 个整数 a1,a2,…,an�1,�2,…,��。
输出格式
输出一个整数,表示截断方法数量。
数据范围
前六个测试点满足 1≤n≤101≤�≤10。
所有测试点满足 1≤n≤1051≤�≤105,−10000≤ai≤10000−10000≤��≤10000。
#include <iostream>
#include <cstring>
#include <algorithm>
#include<unordered_map>
using namespace std;
const int N = 1e5+10;
#define int long long
typedef pair<int, int> PII;
int n,m;
int s[N];
int a[N];
int left[N],r[N];
signed main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
cin>>n;
unordered_map<int,int> mp;
int sum=0,res=0;
for(int i=1;i<=n;i++){
cin>>a[i];
s[i]=s[i-1]+a[i];
sum+=a[i];
}
if(sum%3!=0||n<=2){
cout<<0;
return 0;
}
int x=sum/3;
int cnt=0,y=0;
for(int i=n;i>=1;i--)
{
y+=a[i];
r[i]=cnt-(a[n]==x&&n!=4);
if(y==x)cnt++;
}
for(int i=1;i<=n-2;i++)
{
if(s[i]==x)
{
res+=r[i];
}
}
cout<<res;
}
给定一个长度为 N� 的数列,A1,A2,…AN�1,�2,…��,如果其中一段连续的子序列 Ai,Ai+1,…Aj��,��+1,…�� 之和是 K� 的倍数,我们就称这个区间 [i,j][�,�] 是 K� 倍区间。
你能求出数列中总共有多少个 K� 倍区间吗?
输入格式
第一行包含两个整数 N� 和 K�。
以下 N� 行每行包含一个整数 Ai��。
输出格式
输出一个整数,代表 K� 倍区间的数目。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
const int N = 1e5+10;
#define int long long
int n,m;
int a[N];
int s[N];
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i],s[i]=s[i-1]+a[i];
map<int,int> mp;
mp[0]++;
int res=0;
for(int i=1;i<=n;i++)
{
int x=(s[i]%m+m)%m;
res+=mp[x]; mp[x]++;
}
cout<<res;
}