1. 程式人生 > >51nod 1103 N的倍數 思路:抽屜原理+前綴和

51nod 1103 N的倍數 思路:抽屜原理+前綴和

相等 ace http 程序 pre logs amp cin images

題目:

技術分享

這是一道很神奇的題目,做法非常巧妙。巧妙在題目要求n個數字,而且正好要求和為n的倍數。

思路:用sum[i]表示前i個數字的和%n。得到sum[ 1-N ]共N個數字。

   N個數字對N取模,每個數字都在0-( N-1 )之間。

   可能出現兩種情況 1:有一個數字等於0。(都不相等) 2:至少有兩個數字相等。

1.如果sum數組中有一個數字sum[i]=0,說明前i個數字的和為N的倍數。

2.如果sum[i]==sum[j],說明第i-( j-1 )或者( i+1 )-j的和為N的倍數。

只有1、2兩種情況,不用考慮無解的情況。

#include <bits\stdc++.h>
using
namespace std; int a[50005]; int visit[50005]; //visit[sum%n] != 0 說明有一個前綴和相等的,visit[sum%n]即為索引。 int main(){ int n; cin >> n; for(int i = 1;i <= n; i++){ cin >> a[i]; } long long sum = 0; //前綴和 for(int i = 1;i <= n; i++){ sum = (sum + a[i])%n; //
前綴和%n if(sum != 0 && visit[sum] == 0){ visit[sum] = i; // 不等於0並且沒有出現過,存在visit中 }else{ //等於0或者有相等的,開始輸出結果,並結束程序 cout << i-visit[sum] << endl; for(int j = visit[sum]+1 ;j <= i; j++){ // cout <<"j:"<<j<<" "<< a[j] << " ";
cout << a[j] << endl; } break; } } return 0; } //writed by zhangjiuding

51nod 1103 N的倍數 思路:抽屜原理+前綴和