1. 程式人生 > 其它 >Part2.8 P3131 Subsequences Summing to Sevens S 【字首和、思維】

Part2.8 P3131 Subsequences Summing to Sevens S 【字首和、思維】

原題連結:P3131 [USACO16JAN]Subsequences Summing to Sevens S - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)

題意:給你n個數,分別是a[1],a[2],...,a[n]。求一個最長的區間[x,y],使得區間中的數(a[x],a[x+1],a[x+2],...,a[y-1],a[y])的和能被7整除。輸出區間長度。若沒有符合要求的區間,輸出0。

思路:記錄字首和,字首和對7取餘,技巧:若兩個數相減之差取餘 n 等於0 ,那麼這兩個數取餘 n 的餘數一定相同。

評價:技巧O(n)

 1 #include<bits/stdc++.h>
 2
using namespace std; 3 //#define mod 998244353 4 //const int INF = 1e8; 5 typedef long long ll; 6 ll ma=0,sum[50005],lef[7]={-1,-1,-1,-1,-1,-1,-1}; 7 int main() 8 { 9 int n; 10 scanf("%d",&n); 11 for(int i=1;i<=n;i++) 12 { 13 ll x; 14 scanf("%lld",&x); 15 sum[i]=(sum[i-1
]+x)%7; 16 if(sum[i]==0) ma=max((int)ma,i); 17 if(lef[sum[i]]<0) lef[sum[i]]=i; 18 if(lef[sum[i]]>0) ma=max(ma,i-lef[sum[i]]); 19 } 20 printf("%lld",ma); 21 return 0; 22 }