日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Make Them Equal 埃氏筛法(1200)

發布時間:2025/3/19 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Make Them Equal 埃氏筛法(1200) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


題意 :

  • 給一長度為n的字符串,進行以下操作,將所有字符都變成字符c :取一個整數1<=i<=n1<=i<=n1<=i<=n,令所有不被i整除的j有s[j] == c,求最小操作次數

思路 :

  • 如果s全為c,輸出0
  • 如果最后一位為c,輸出1 n
  • 如果最后一位不為c,從2開始枚舉,考慮是否有一個數能將所有字符改為c,優化枚舉方案,用類似于埃氏篩的思想,考慮當前這個數的所有倍數在字符串中所對應的字符是否不是c,如果有的話這個數就不合理,這樣的復雜度是O(nlogn)O(nlogn)O(nlogn),可以過
  • 如果有這樣的數 輸出 1 x
  • 如果沒有 輸出 2 ,取一個非n因數的任意數(比如n?1n-1n?1,就不需要枚舉了)和n
#include <iostream> #include <algorithm> #include <cstring> #include <vector> #define endl '\n'using namespace std;typedef long long ll;void solve() {int n;char c;string s;cin >> n >> c >> s;bool flag = true;for (int i = 0; i < n; i ++ )if (s[i] != c){flag = false;break;}if (flag){cout << 0 << endl;return ;}if (s[n - 1] == c){cout << 1 << endl << n << endl;return ;}for (int i = 2; i <= n; i ++ ){bool ok = true;for (int j = i; j <= n; j += i)if (s[j - 1] != c){ok = false;break;}if (ok){cout << 1 << endl << i << endl;return ;}}cout << 2 << endl << n - 1 << ' ' << n << endl; }int main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);int _ = 1;cin >> _;while (_ -- ){solve();}return 0; }
  • 優化 :考慮證明結論 n的后一半數中,存在某個值不在下標序列中,則這個值可以作為答案。充分性顯然成立,必要性考慮n的前一半數如果作為答案,則一定有一個它的倍數屬于n的后一半數,且不在下標序列中
  • 上述所有情況都不滿足時,輸出n和n-1即可消除所有數

總結

以上是生活随笔為你收集整理的Make Them Equal 埃氏筛法(1200)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。