同余前缀和

 1 #include<iostream>
 2 using namespace std;
 3 
 4 /*
 5     原题地址:https://www.luogu.com.cn/problem/P3131
 6     农夫约翰的 \( N \) 头奶牛站在一排,就像它们时不时做的那样。每头奶牛都有一个唯一的整数ID号,
 7     这样农夫约翰可以区分它们。农夫约翰想要给一组连续的奶牛拍照,但由于他童年时的一次创伤事件涉及
 8     数字 1 到 6,他只会在奶牛的ID号之和是7的倍数时才拍照。
 9     请帮助农夫约翰确定他可以拍摄的最大奶牛组的大小。
10     
11 示例数据输入:
12     10
13     3 1 4 10 5 9 2 6 8 7
14 */
15 
16 int main() {
17     int a, b[100] = {0}, n, i, ans = 0;
18     int first[7] = {0, -1, -1, -1, -1, -1, -1}, last[7]={0};
19     cin >> n;    // 假设有十头牛,这里n输入10
20     for (i = 1; i <= n; i++) {
21         cin >> a;                //  将每一头牛的ID进行输入,可以参考上面的数据输入示例
22         b[i] = (a + b[i-1]) % 7;     // 初始化ID的同时,对每个前缀和进行模7的操作,也就是除以7的余数放b数组里面
23         if (first[b[i]] == -1)first[b[i]] = i;  // 记录每个模数第一次出现的位置,模数就是first数组的索引
24         last[b[i]] = i;        // 记录每个模数最后一次出现的位置
25     }
26     
27     for (i = 0; i < 7; i++)
28         if (first[i] != -1)
29             ans = (last[i] - first[i] > ans) ? (last[i] - first[i]) : ans;    // 获取最大长度
30     cout << ans << endl;
31     return 0;
32 }
同余前缀和

 

posted @ 2025-01-19 16:32  TP_003  阅读(20)  评论(0)    收藏  举报