51nod 1103 N的倍数 思路:抽屉原理+前缀和
生活随笔
收集整理的這篇文章主要介紹了
51nod 1103 N的倍数 思路:抽屉原理+前缀和
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目:
這是一道很神奇的題目,做法非常巧妙。巧妙在題目要求n個數(shù)字,而且正好要求和為n的倍數(shù)。
?
思路:用sum[i]表示前i個數(shù)字的和%n。得到sum[ 1-N ]共N個數(shù)字。
N個數(shù)字對N取模,每個數(shù)字都在0-( N-1 )之間。
可能出現(xiàn)兩種情況 ?1:有一個數(shù)字等于0。(都不相等) ? 2:至少有兩個數(shù)字相等。
?
?
?
1.如果sum數(shù)組中有一個數(shù)字sum[i]=0,說明前i個數(shù)字的和為N的倍數(shù)。
2.如果sum[i]==sum[j],說明第i-( j-1 )或者( i+1 )-j的和為N的倍數(shù)。
?
只有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并且沒有出現(xiàn)過,存在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的倍数 思路:抽屉原理+前缀和的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 51nod 1393 0和1相等串 思路
- 下一篇: 51 nod 1097 拼成最小的数 思