【洛谷P3131】 【USACO16JAN】子共七
P3131 [USACO16JAN]子共七Subsequences Summing to Sevens
题目描述
Farmer John's cows are standing in a row, as they have a tendency to do from time to time. Each cow is labeled with a distinct integer ID number so FJ can tell them apart. FJ would like to take a
photo of a contiguous group of cows but, due to a traumatic childhood incident involving the numbers
, he only wants to take a picture of a group of cows if their IDs add up to a multiple
of 7.
Please help FJ determine the size of the largest group he can photograph.
给你n个数,求一个最长的区间,使得区间和能被7整除
输入输出格式
输入格式:The first line of input contains (
). The next
lines each contain the integer IDs of the cows (all are in the range
).
Please output the number of cows in the largest consecutive group whose IDs sum
to a multiple of 7. If no such group exists, output 0.
输入输出样例
7 3 5 1 6 2 14 10
5
说明
In this example, 5+1+6+2+14 = 28.
这个题我看了一些题解的代码,发现
自己的代码真是太棒了!
不要问我为什么都用了longlong,数组开的那么大,因为我下面会解释的
我第一次交了80分,然后十分自信地认为开小数组或者没用longlong,然后改了,然后就过了
写一写题解吧,首先是进制的转化,这里用的是很常规的取摸(不懂得童鞋可以自行百度进制转换方法,这种方法很类似于短除法)。
先记录一个前缀和。两个前缀和mod7同余,则这两个前缀和的差值一定被7整除。
这里采取记余数,b[i]表示余数为i的前缀的最小下标
好了看程序吧,正确性应该是显然的
不懂得私信评论或Q:568251782均可
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> const int MAXN = 50000 + 10; long long sum[MAXN],n; long long b[7]; long long ans; int main() { scanf("%d", &n); for(long long i = 1;i <= n;i++) { int num; scanf("%d", &num); sum[i] = sum[i-1] + num; } for(int i = 1;i <= n;i++) { long long a; a = sum[i] % 7; if(a == 0) { ans = i; } else if(b[a]) { if(ans < i - b[a]) { ans = i - b[a]; } } else { b[a] = i; } } printf("%d", ans); return 0; }