1. 程式人生 > >hdu 4686 Arc of Dream 多校第九場

hdu 4686 Arc of Dream 多校第九場

矩陣+快速冪

根據 a[i]*b[i]=(a[i-1]*ax+ay)*(b[i-1]*bx+by)   ==  a[i-1]*b[i-1]*ax*bx+a[i-1]*ax*by+b[i-1]*bx*ay+ay*by

用公式推出矩陣之後  快速冪一下就好了。。。

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
#define clr(a, x) memset(a, x, sizeof(a))
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define REP(i,a,b) for(int i=a;i<=b;i++)
typedef __int64 lld;
const int maxn = 1010;
const lld mod = 1000000007;

struct mat
{
    lld a[5][5];
};
mat res,org;
mat mul(mat a,mat b)
{
    mat ret;
    for(int i=0;i<5;i++)
        for(int j=0;j<5;j++)
    {
        lld t=0;
        for(int k=0;k<5;k++)
            t=(t+a.a[i][k]*b.a[k][j])%mod;
        ret.a[i][j]=t;
    }
    return ret;
}
void ksm(lld n)
{
    while(n)
    {
        if(n&1) res=mul(res,org);
        org=mul(org,org);
        n>>=1;
    }
}
int main()
{
    lld n,a0,ax,ay,b0,bx,by;
    while(cin>>n>>a0>>ax>>ay>>b0>>bx>>by)
    {
        memset(res.a,0,sizeof(res.a));
        memset(org.a,0,sizeof(org.a));
        res.a[0][1]=a0*b0%mod;
        res.a[0][2]=a0%mod;
        res.a[0][3]=b0%mod;
        res.a[0][4]=1;
        org.a[0][0]=1;
        org.a[1][0]=1;org.a[1][1]=((ax%mod)*bx)%mod;
        org.a[2][1]=ax*by%mod;org.a[2][2]=ax%mod;
        org.a[3][1]=bx*ay%mod;org.a[3][3]=bx%mod;
        org.a[4][1]=ay*by%mod;org.a[4][2]=ay%mod;org.a[4][3]=by%mod;org.a[4][4]=1;
        ksm(n);
        cout<<res.a[0][0]<<endl;
    }
}
/*
res

AoD ai*bi ai bi 1
0    0    0   0 0
0    0    0   0 0
0    0    0   0 0
0    0    0   0 0

org

1   0   0   0   0
1 ax*bx 0   0   0
0 ax*by ax  0   0
0 bx*ay 0   bx  0
0 ay*by ay  by  1
*/


相關推薦

hdu 4686 Arc of Dream

矩陣+快速冪 根據 a[i]*b[i]=(a[i-1]*ax+ay)*(b[i-1]*bx+by)   ==  a[i-1]*b[i-1]*ax*bx+a[i-1]*ax*by+b[i-1]*bx*ay+ay*by 用公式推出矩陣之後  快速冪一下就好了。。。 #inc

HDU-4686-Arc of Dream (矩陣快速冪)

原題連結: An Arc of Dream is a curve defined by following function: where a 0 = A0 a i = a i-1AX+AY b 0 = B0 b i = b i-1BX+BY What is the value o

HDU 4686 Arc of Dream (矩陣快速冪)

#include<bits/stdc++.h> using namespace std; #define debug puts("YES"); #define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++) #def

hdu 6127 : Hard challenge (2017 1008)(計算幾何)

for %d logs opera log val r+ ++ show 題目鏈接 題意:二維平面上有n個點(沒有重疊,都不在原點,任意兩點連線不過原點),每個點有一個權值,用一條過原點的直線把他們劃分成兩部分,使兩部分的權值和的乘積最大。輸出最大的乘積。 極角排序後,將原

HDU 5316 Magician(2015 線段樹)

Fantasy magicians usually gain their ability through one of three usual methods: possessing it as an innate talent, gaining it through study and practice,

hdu 1005(hdu-6430:TeaTree)

題目大意: 對於一個結點 x,它的值可以是當前子樹內任意兩點的gcd值。但是要求 lca(i,j)=x。 最後問你每個結點最大的值可能是多少,如果不存在輸出-1。 解題思路: 本來想用樹上dsu來寫的,結果寫了一上午,總感覺dsu有哪些地方不對勁,開始刪刪改改

hdu 5852 Intersection is not allowed! (20161009)組合

這是一道公式題,雖然想了半天也想不出來,https://en.wikipedia.org/wiki/Lindström–Gessel–Viennot_lemma看這個就行了。 #include<cstdio> #include<cstring> #i

2018牛客E(動態規劃,思維,取模)

pac namespace for ons mod 思維 space scan 動態規劃 #include<bits/stdc++.h>using namespace std;const long long mod=1000000007,inv=57000000

杭電 HDU6415 Rikka with Nash Equilibrium dp

lar mon 範圍 font fin guarantee stc occurs wing Rikka with Nash Equilibrium Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288

2018 Multi-University Training Contest 9 杭電

1001 Rikka with Nash Equilibrium 可以dp,也可以找規律 #include<bits/stdc++.h> #define N 100005 #define P pair<int,int> using namespace std

杭電

k題題意 一天你去打羽毛球  遇見a,b,c,d四種人。 a是白條哥啥都沒有,b只有拍子,c只有球,d有一個拍子一個球。 pop(a+b+c+d)=n  pop是人數  你現在想打羽毛球,從這四種人中任意挑人打比賽,要求至少有兩個拍子一個球,可以任意個人。。。 問在

2018杭電

A #include <iostream> #include <cmath> #include <cstring> #include <cstdio> #include <algorithm> #include &

2018暑假杭電

1001-Rikka with Nash Equilibrium(hdu 6415) 題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=6415 題

2019牛客

H Cutting Bamboos 題意 給n個高度,每次獨立詢問一個區間\([l,r]\),對於這個區間的所有高度,要求砍\(y\)次剛好全部砍完,問第\(x\)次砍的位置。 分析 可以二分砍的位置,計算出第\(x\)次砍掉的所有高度,進行check,所以問題就轉化為如何求區間\([l,r]\)裡大於某個

20174 HDU 6078 Wavel Sequence DP

bsp wav hdu pac i++ size 個數 style mem 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6078 題意:求兩個序列的公共波形子序列的個數。 解法: 類似於最長公共上升子序列,對於每個i,只考慮

20157 HDU 5379 Mahjong tree 構造,DFS

print () name long scanf 2015多校 printf color tree 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=5379 題意:一顆n個節點n-1條邊的樹,現在要給每個節點標號(1~n),要求

20164 HDU 6076 Security Check DP,思維

pro begin sizeof || i++ 預處理 通過 第一個 ans 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6076 題意:現要檢查兩條隊伍,有兩種方式,一種是從兩條隊伍中任選一條檢查一個人,第二種是在每條隊伍

hdu 6088 Rikka with Rock-paper-scissors (2017 1004) 【組合數學 + 數論 + 模意義下的FFT】

i++ put c擴展 notice const pri 得到 處理 質數 題目鏈接 首先利用組合數學知識,枚舉兩人的總勝場數容易得到 這還不是卷積的形式,直接搞的話復雜度大概是O(n^2)的,肯定會TLE。但似乎和卷積有點像?想半天沒想出來。。多謝Q巨提醒,才知道可以用

20177 HDU 6129 Just do it 找規律

ble nbsp bool name def ons spa esp bre 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6129 題意:求a序列後m次xor前綴和 解法: 手動對1位置對每個位置的貢獻打表發現 第一次 貢

20179 HDU 6170 Two strings DP

ems str php hdu 鏈接 兩種 namespace turn bit 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6170 題意:給了2個字符串,其中第2個字符串包含.和*兩種特別字符,問第二個字符串能否和第一個