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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

美团杯2020 - 平行四边形(原根)

發布時間:2024/4/11 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 美团杯2020 - 平行四边形(原根) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:點擊查看

題目大意:

蒜斜非常喜歡下圍棋。自從AlphaOg面世以來,他就立志一定要研究出AlphaOg的破綻。 終于,他發現當AlphaOg遇到一種特殊局面后,它的神經網絡會自動輸出“投降”!

隨著進一步的研究,蒜斜發現這種局面有著更一般的特性,不僅僅局限于固定大小棋盤。 具體來說,當棋盤大小是?nn(n+1n+1?是一個質數)且棋盤上恰好有?nn?個棋子的時候,如果這些棋子的位置滿足下列條件,那么 AlphaOg 就會直接投降。假設第?ii?個棋子的位置是點?PiPi,處在第?xixi?行第?yiyi?列,那么這些坐標需要滿足:

  • x1 至?xn 是?1?n 的排列。
  • y1 至?yn 是?1?n 的排列。
  • 這些點之間不構成平行四邊形(包括退化)。即對于任何兩個不完全相同的棋子對?(Pa,Pb),(Pc,Pd)(允許它們之間共用至多一個棋子),線段?PaPb 與?PcPd 要么長度不同,要么所在的直線不平行且不重合。
  • 憑借這項發現,蒜斜榮獲了“北大算協吉祥物”的稱號。 如果你也能找出一種合法方案,蒜斜的稱號就是你的了!

    輸入格式

    輸入第一行包含一個整數?t(1≤t≤10),表示數據組數。

    對于每組數據,輸入第一行包含一個整數?n(4≤n≤1000),保證?n+1 是一個質數。

    輸出格式

    對于每組數據,如果無解輸出一行一個整數 -1。否則輸出?nn?行,每行兩個整數?(xi,yi)(1≤xi≤n,1≤yi≤n),表示第?ii?個棋子的坐標。如果坐標方案不唯一,你只需要輸出任意一種。

    樣例一

    input

    1 4

    output

    1 1 3 2 4 3 2 4

    限制與約定

    Small Task:?n≤12n≤12。

    Large Task:?n≤1000n≤1000。

    時間限制:1s1s

    空間限制:512MB

    題目分析:首先需要知道原根的定義:

    假設一個數g是P的原根,那么g^i mod P的結果兩兩不同,且有 1<g<P,0<i<P,歸根到底就是g^(P-1) = 1 (mod P)當且僅當指數為P-1的時候成立.(這里P是素數)。(百度百科)

    ?換句話說,質數 P 一定有原根

    既然題目提示了 n + 1 是一個質數,結合到原根上去,不難發現 g ^ i % ( n + 1 ) 的集合符合 1 ~ n 的一個排列

    這樣情況一和情況二都滿足了,只需要證明情況三也滿足就ok了

    任取四個點 A( a , g^a ) ,?B( b , g^b ) ,?C( c , g^c ) ,?D( d , g^d ) ,如果四個點想要構成平行四邊形的話,那么需要同時滿足下面兩個條件,且共用的點至多有一個:假設 b < a 且 d < c

  • a - b == c - d
  • g^a - g^b == g^c - g^d
  • 當 a - b == c - d 時,g^a - g^b = g^b * ( g^( a - b )?- 1 ) ,同理 g^c - g^d = g^d * ( g^( c - d ) - 1 ),因為 a - b == c - d ,所以?g^b * ( g^( a - b )?- 1 )? 與 g^d * ( g^( c - d ) - 1 ) 中的?g^( a - b ) ==?g^( c - d ) ,所以將括號約分之后可以得到 g^b == g^d,再帶回原式?g^a - g^b == g^c - g^d 中,可以得出 g^a == g^c,根據原根的定義可知,此時 b == d 且 a == c ,也就是點 A 與點?C 重合,且點 B 與點 D 重合,無法做到既是兩邊平行且相等,同時至多只有一個點共用,所以情況 3 成立

    綜上,只需要讓 x 坐標為 i ,y 坐標為 g^i%P 即可,至于原根 g ,可以根據其定義暴力求解

    代碼:

    #include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e3+100;bool vis[N];int find_root(int mod) {for(int i=2;i<mod;i++){memset(vis,false,sizeof(vis));bool flag=true;int x=i;for(int j=1;j<=mod-1;j++){if(vis[x]){flag=false;break;}vis[x]=true;x=x*i%mod;}if(flag)return i;} }int main() { #ifndef ONLINE_JUDGE // freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); #endif // ios::sync_with_stdio(false);int w;cin>>w;while(w--){int n;scanf("%d",&n);int mod=n+1;int rt=find_root(n+1);int x=rt;for(int i=1;i<=n;i++){printf("%d %d\n",i,x);x=x*rt%mod;}}return 0; }

    ?

    總結

    以上是生活随笔為你收集整理的美团杯2020 - 平行四边形(原根)的全部內容,希望文章能夠幫你解決所遇到的問題。

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