Wannafly冬のキャンプ2020日5G暗号で擬似乱数ジェネレータを固定します - 分块

プライム与えられたデータの複数のセット、\(P \)は、その全てが必要\(X \)よう\(F(X)= \ MIN_ {K = 2} ^ XF(K)\) ここで\(F(X) = X ^ { - 1} \ )

すべての\(P \)([1、10 ^ 9] \)\均一で選択

解決

明らかに、逆の順序対称的な関係

このように列挙のルート、対称出力の後半に

なぜこれが時間のための私の問題カードです:(

書かれた列挙国境を開始\(\ sqrtのP \)方法を通じて行くだろう

私は後に活発なことができました

#include <bits/stdc++.h>
using namespace std;

#define int long long

int a[1000005],p,t;

signed main() {
    ios::sync_with_stdio(false);
    cin>>t;
    while(t--) {
        cin>>p;
        vector <pair<int,int> > v;
        int lim=sqrt(p);
        a[1]=1;
        int mx=1e9,pos=1;
        for(int i=2;i<=p;i++) {
            a[i]=-(p/i)*a[p%i],
            a[i]=(a[i]%p+p)%p;
            if(i>=a[i]) break;
            mx=min(mx,a[i]);
            if(mx==a[i]) {
                if(i<a[i])
                    v.push_back(make_pair(i,a[i]));
            }
        }
        int flag=0;
        if(sqrt(p+1) == (int)sqrt(p+1)) flag=1;
        cout<<2*v.size()+flag<<endl;
        for(int i=0;i<v.size();i++) cout<<v[i].first<<" "<<v[i].second<<endl;
        if(flag) cout<<(int)sqrt(p+1)<<" "<<(int)sqrt(p+1)<<endl;
        for(int i=v.size()-1;i>=0;--i) cout<<v[i].second<<" "<<v[i].first<<endl;
    }
}

おすすめ

転載: www.cnblogs.com/mollnn/p/12345101.html