矩陣快速冪+快速乘即可。總調不出來,然後發現輸出時a寫成b了sadsadsad。
#include#include#include#includeusing namespace std;#define rep(i,s,t) for(int i=s;i<=t;i++)
#define clr(x,c) memset(x,c,sizeof(x))
#define ll long long
ll read()
ll mod,a,c,xx,n,g;
ll qmul(ll x,ll y)
return ans;
}struct matrix
matrix operator*(const matrix&o)const
}b,a;
int main()
printf("%lld\n",((qmul(xx,a.a[1][1])+a.a[2][1])%mod)%g);
return 0;
}
棟棟最近迷上了隨機演算法,而隨機數生成是隨機演算法的基礎。棟棟準備使用線性同餘法(linear congruential method)來生成乙個隨機數列,這種方法需要設定四個非負整數引數m, a, c, x0,按照下面的公式生成出一系列隨機數:
xn+1 = (axn + c) mod m
mod m 表示前面的數除以m的餘數。從這個式子可以看出,這個序列的下乙個數總是由上乙個數生成的。
用種方法生成的序列具有隨機序列的性質,因此這種方法被廣泛地使用,包括常用的c++和pascal 的產生隨機數的庫函式使用的也是這種方法。
知道這樣產生的序列具有良好的隨機性,不過心急的他仍然想盡快知道xn 是多少。由於棟棟需要的隨機數是0, 1,…, g − 1 之間的,他需要將xn除以g。取餘得到他想要的數,即xn mod g,你只需要告訴棟棟他想要的數xn mod g 是多少就可以了。
包含6個用空格分割的m,a,c,x0,n和g,其中a,c,x0是非負整數,m,n,g是正整數。
輸出乙個數,即xn mod g
11 8 7 1 5 3
21<=n,m,a,c,x0<=10^18,1<=g<=10^8
bzoj2875 Noi2012 隨機數生成器
time limit 10 sec memory limit 512 mb submit 1007 solved 577 submit status discuss 包含6個用空格分割的m,a,c,x0,n和g,其中a,c,x0是非負整數,m,n,g是正整數。輸出乙個數,即xn mod g 11 8...
bzoj2875 Noi2012 隨機數生成器
題目鏈結 求 矩乘板子,這裡主要講下會爆long long的整數相乘取模,我們用double可以做到 求 求出 rfloor 我們用long double搞。那麼最後的答案就是 我們直接long long搞,可以視作是在模 的意義下運算。什麼鬼嘛。可以long long搞的原因應該是這樣的。與 不同...
bzoj2876 Noi2012 騎行川藏
蛋蛋非常熱衷於挑戰自我,今年暑假他準備沿川藏線騎著自行車從成都前往拉薩。川藏線的沿途有著非常美麗的風景,但在這一路上也有著很多的艱難險阻,路況變化多端,而蛋蛋的體力十分有限,因此在每天的騎行前設定好目的地 同時合理分配好自己的體力是一件非常重要的事情。由於蛋蛋裝備了一輛非常好的自行車,因此在騎行過程...