UVA 12169 Disgruntled Judge 枚舉+擴展歐幾裡得

来源:http://www.cnblogs.com/pach/archive/2016/11/12/6057160.html
-Advertisement-
Play Games

題目大意:有3個整數 x[1], a, b 滿足遞推式x[i]=(a*x[i-1]+b)mod 10001。由這個遞推式計算出了長度為2T的數列,現在要求輸入x[1],x[3],......x[2T-1], 輸出x[2],x[4]......x[2T]. T<=100,0<=x<=10000. 如果 ...


題目大意:有3個整數 x[1], a, b 滿足遞推式x[i]=(a*x[i-1]+b)mod 10001。由這個遞推式計算出了長度為2T的數列,現在要求輸入x[1],x[3],......x[2T-1], 輸出x[2],x[4]......x[2T]. T<=100,0<=x<=10000. 如果有多種可能的輸出,任意輸出一個結果即可。

由於a和b都小於等於10000,直接枚舉a和b暴力可以過。但是有沒有更快的方法呢?

首先令遞推式的i=2,那麼x[2]=(a*x[1]+b)mod 10001;再令i=3,得x[3]=(a*x[2]+b)mod 10001,可以得出x[3]=(a*(a*x[1]+b)+b)mod 10001。這時候只有a和b是變數,我們枚舉a,就可以求出b了。(a+1)*b mod 10001 = ( (x[3]-a*a*x[1]) mod 10001 + 10001 ) mod 10001.(這裡的x[3]-a*a*x[1]可能為負,代碼中可以先不取模,後面計算b的時候一起取模即可) 所以簡化成(a+1)*b mod 10001 = (x[3]-a*a*x[1]) mod 10001。這裡就變成了同模方程,擴展歐幾裡得即可解答。

暴力代碼:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int maxn=10000+5;
const int mod=10001;
int in[maxn];

int main()
{
    //freopen("in.txt","r",stdin);
    int t;
    scanf("%d",&t);
    for(int i=0; i<t; i++)
        scanf("%d",in+i);
    bool flag;
    for(int a=0; a<=10000; a++)
    {
        for(int b=0; b<=10000; b++)
        {
            flag=false;
            for(int i=1; i<t; i++)
                if(in[i]!=((a*(a*in[i-1]%mod+b)+b)%mod))
                {
                    flag=true;
                    break;
                }
            if(!flag)
            {
                for(int i=0; i<t; i++)
                    printf("%d\n",(a*in[i]+b)%mod);
                break;
            }
        }
        if(!flag)
            break;
    }
    return 0;
}

擴展歐幾裡得:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int maxn=10000+5;
const int mod=10001;
int in[maxn];
typedef long long ll;

ll exgcd(ll a, ll b, ll&x, ll&y)
{
    if (b == 0)
    {
        x = 1;
        y = 0;
        return a;
    }
    ll r = exgcd(b, a%b, y, x);
    ll t = x;
    y = y - a/b*t;
    return r;
}
int main()
{
    //freopen("in.txt","r",stdin);
    int t;
    scanf("%d",&t);
    for(int i=0; i<t; i++)
        scanf("%d",in+i);
    bool flag;
    for(ll a=0; a<=10000; a++)
    {
        ll x,y;                     //定義long long 型是保證沒有取模的式子不會超記憶體
        ll g=exgcd(a+1,mod,x,y);
        ll tmp=in[1]-a*a*in[0];     //這裡可以先不取模,後面計算b的時候取模
        if(tmp%g==0)
        {
            flag=false;
            ll b=(x*tmp/g)%mod;     //這裡最好取下模,雖然後面計算in[i]的時候也會取模,但是算出來的in[i]可能因為b負太多而變成負數
            for(int i=1;i<t;i++)
            {
                if(in[i]!=(a*(a*in[i-1]+b)+b)%mod)
                {
                    flag=true;
                    break;
                }
            }
            if(!flag)
            {
                for(int i=0;i<t;i++)
                    printf("%d\n",(a*in[i]+b)%mod);
                break;
            }
        }

    }
    return 0;
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、設置一個新的測試項目 在用google test寫測試項目之前,需要先編譯gtest到library庫並將測試與其鏈接。我們為一些流行的構建系統提供了構建文件: msvc/ for Visual Studio, xcode/ for Mac Xcode, make/ for GNU make,  ...
  • 背景說明 最近在工作項目中有下麵一個場景: 使用Node.js的express框架實現了一個文件系統伺服器端,其中有個API用於客戶端上傳文件。客戶端使用Node.js的HttpClient來調用伺服器端的API上傳文件。 客戶端在上傳小文件時沒有任何問題,在上傳大文件時httpClient請求報錯 ...
  • wordpress是用php語言開發的博客平臺,它擴展性強,容易擴展,很適合拿來做二次開發。 1,問題由來 本周五,我在瀏覽公司的網站(基於wordpress開發)時發現,網站首頁上有兩篇文章的縮略圖重覆了,於是我進入網站後臺檢查,想看下是不是某位員工在撰寫文章時不小心這兩篇文章選擇了相同的圖片作為 ...
  • CREATESTRUCT結構CREATESTRUCT結構具有如下形式:typedef struct tagCREATESTRUCT{ LPVOID lpCreateParams; HANDLE hInstance; HMENU hMenu; HWND hwndParent; int cy; int ...
  • 第一種方式: javabean: 1 public class BusLoanInfoShop { 2 private Integer id; 3 private Integer bid; 4 private String shopName; 5 private String platformNam ...
  • 一.通過Socket實現TCP編程 1.1 TCP編程 TCP協議是面向連接,可靠的,有序的,以位元組流的方式發送數據。基於TCP協議實現網路通信的類有客戶端的Socket類和伺服器端的ServerSocket類。 1.2 伺服器端套路 1.創建ServerSocket對象,綁定監聽埠。 2.通過a ...
  • [java編程思想中文(第4版)] 2007 練習2答案 (1)參照本章的HelloDate.java這個例子,創建一個“Hello,World”程式,改程式 只要輸出這句話即可。你所編寫的類里只需一個方法(即“main”方法,在程式啟動時被執行)。 記住要把它設位static形式,並指定參數表 即 ...
  • 項目背景:spring、hibernate、以及JSF(xhtml頁面)和springmvc(JSP頁面) 1.項目中使用springmvc框架的每個JSP頁面都會使用<%@include file="../resource.jsp"%>來引用一個模板頁面;在resource.jsp頁面中放置所有引 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...