关于7的迷题
Description
给你n个数,分别是a[1],a[2],...,a[n]。
求一个最长的区间[x,y], 使得区间中的数(a[x],a[x+1],a[x+2],...,a[y-1],a[y])的和能被7整除。
输出区间长度。若没有符合要求的区间,输出0。
Format
Input
第一行给出数字N,1≤N≤50,000
接下来N个数字,值在[0…1,000,000]
Output
如题
Samples
输入数据 1
7
3
5
1
6
2
14
10
输出数据 1
5
Hint
选取区间
[5,1,6,2,14]
其总和为7的倍数
#include<bits/stdc++.h> using namespace std; int n,a,s,l[7],r[7],ans; int main() { scanf("%d",&n); memset(l,-1,sizeof(l)); l[0]=0; for(int i=1;i<=n;++i) { scanf("%d",&a); s=(s+a)%7; if(l[s]==-1) l[s]=i; r[s]=i; } for(int i=0;i<=6;++i) if(l[i]!=-1) ans=max(ans,r[i]-l[i]); printf("%d",ans); }
给你N个数字,每个数字不是1就是-1 问多少个连续的数列和为0
# Format
## Input
第一行为N, ,N小于等于1e6
第二行为N个用空格隔开的1和-1序列。
## Output
总方案数MOD 999999的值
# Samples
```input1
9
-1 1 -1 -1 -1 1 1 -1 -1
``` ```
output1
8 ```
Hint
例如第1个数字到第2个数字 第2个到第7个数字 第6个到第9个数字 它们的和均为0 一共有8种情况 此题需要用到数组来保存来数字
#include<bits/stdc++.h> using namespace std; #define int long long long long n,m,ans; int v[2200000]; int a[1002001],sum[1002001]; main() { cin>>n; int temp=1000000; v[0+temp]=1; for(int i=1;i<=n;i++) { cin>>a[i]; sum[i]=sum[i-1]+a[i]; ans=(ans+v[sum[i]+temp])%999999; v[sum[i]+temp]++; } cout<<ans; return 0; }
求方案
Description
有 n 个正整数排成一行。你的目的是要从中取出一个或连续的若干个数,使它们的和能够被 k 整除。
例如,有 6 个正整数,它们依次为 1; 2; 6; 3; 7; 4。
若 k = 3,则你可以取出 1; 2; 6,或者 2; 6; 3; 7,也可以仅仅取出一个 6 或者 3 使你所取的数之和能被 3 整除。
当然,满足要求的取法不止以上这 4 种。事实上,一共有 7 种取法满足要求。
给定 n 和 k,以及这 n 个数。
你的任务就是确定从这 n 个数中取出其中一个数或者若干连续的数,使它们的和能被 k 整除有多少方法。
记 Ha = 1234567,由于取法可能很多,
因此你只需要输出它 mod Ha 的值即可
Format
Input
第一行为两个整数 n; k。
以下 n 行每行一个正整数,描述这个序列。
1 <= n <= 500000; 1 <= k <= 100000
Output
输出一个整数,为答案 mod Ha 的结果。
Samples
输入数据 1
6 3
1
2
6
3
7
4
输出数据 1
7
#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 110; int n, k, ans; int b[N]; int main () { scanf ("%d %d", &n, &k); b[0] = 1; for (int i = 1, x, sum = 0; i <= n; i ++) { scanf ("%d", &x); sum = (sum + x) % k; ans += b[sum]; b[sum] ++; } printf ("%d\n", ans); } /* */
P01236. Divisible Subsequence
Description
给出一个数列,希望你从中找出一些连续的子数列,要求子序列的元素之和能被N整除
Format
Input
第一行给出数字D,N。 D代表数列一共有多少个元素,N代表被整除的数 下面一行给出D个数字, 每个数字范围在[1, 1000000000]
1 <= d < = 1000000
1<= N <=50000.
Output
一共有多少个子序列满足条件
Samples
输入数据 1
3 3
1 2 3
输出数据 1
3
【样例解释】
你可以取[1,2],[1,2,3],[3]这三个子数列
#include<cstdio> using namespace std; long long n,k,sum[1000005]; long long ans,qwq; int main(){sum[0]=1; scanf("%d%d",&n,&k); for(int i=1,x;i<=n;i++){ scanf("%d",&x); qwq=(qwq+x)%k; sum[qwq]+=1; } for(int i=0;i<k;i++) if(sum[i]>=1) ans+=(sum[i]*(sum[i]-1))/2; printf("%lld",ans); return 0; }
#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 110; int n, k; int b[N]; long long ans; int main () { scanf ("%d %d", &n, &k); b[0] = 1; for (int i = 1, x, sum = 0; i <= n; i ++) { scanf ("%d", &x); sum = (sum + x) % k; ans += b[sum]; b[sum] ++; } cout<<ans<<endl; }
P05537. 连续子序列之和
Description
给你一个N,再给出这个数字 问有多少连续子序列之和等于 K
Format
Input
第一行给出N,K 接下来给出N个数字
1≤N≤2×10^5
∣Ai∣≤10^9
∣K∣≤10^15
Output
如题目
Samples
输入数据 1
6 5
8 -3 5 7 0 -4
输出数据 1
3
输入数据 2
4 3
3 3 3 3
输出数据 2
4
#include<bits/stdc++.h> using namespace std; #define int long long int n,m,ans; map<int,int> v; int a[202001],sum[202001]; main() { cin>>n>>m; for(int i=1;i<=n;i++) { cin>>a[i]; sum[i]=sum[i-1]+a[i]; ans+=v[sum[i]-m]; v[sum[i]]++; } cout<<ans; return 0; }
标签:数列,int,sum,long,问题,连续,ans,main,数字 From: https://www.cnblogs.com/cutemush/p/17363185.html