NOI2015模擬YYT 傳送

2021-08-19 17:09:23 字數 1817 閱讀 7657

你在乙個有n 個點的環上,環上點按逆時針順序標號為0 到n - 1。你一

開始在0 號點。你在每一回合可以使用k 種傳送中的一種,第i 種傳送會將你

按逆時針方向移動ai 個點。有m 個限制條件,對於每個限制條件(xi; yi),要

求不能在第xi 步之後在yi 號點上。你要求出經過l 步之後在0 號點的方案數

模998244353。

直接ntt?o(

mnlo

g2n)

成功拿到60分。

考慮優化一下.

現在把轉移陣列看作c.要求c

k 。

正常做法:快速冪ntt

一次複雜度:o(

nlog

2n)

在這道題中,n是二的整次冪,所以模n剛好回到原位,其實有: df

t(c∗

c)=d

ft(c

)∗df

t(c)

因此可以先對c進行dft點值運算,搞個k次冪,再插值回來。

這為什麼是對的?

還記得為什麼fft要開兩倍。

因為它實際上是乙個迴圈卷積。c=

a∗b

c(i+

j)mo

dn=∑

n−1i

=0∑n

−1j=

0a[i

]∗b[

j]

隨便你用點積自我乘個無數遍,它都會剛好溢位,溢位就是mo個次數界,這裡的次數界=n*2,剛好符合我們的需求。

因此複雜度降為o(

mnlo

gn)

code:

#include

#include

#define ll long long

#define fo(i, x, y) for(int i = x; i <= y; i ++)

#define ff(i, x, y) for(int i = x; i < y; i ++)

using

namespace

std;

const

int n = 2e5 + 5;

const ll mo = 998244353;

int n, l, m, k, x;

ll s[n], b[n], c[n];

struct node a[n];

ll w[n], tx;

ll ksm(ll x, ll y)

void dft(ll *a, int n)

for(int m = 2; m <= n; m *= 2) }}

}ll ni;

void fft(ll *a, ll *b, int n)

int cmp(node a, node b)

int main()

while(1

<< tx ++ < n) tx ++;

sort(a + 1, a + m + 1, cmp);

s[0] = 1; a[0].x = 0; a[m + 1].x = l;

int n0 = n;

n = 1

<< tx; ll v = ksm(3, (mo - 1) / n);

w[0] = 1; fo(i, 1, n) w[i] = w[i - 1] * v % mo;

dft(b, n);

ni = ksm(n, mo - 2);

fo(i, 1, m + 1) if(i == 1 || a[i].x != a[i - 1].x)

}printf("%lld", s[0]);

}

NOI2015模擬9 9 取石子(博弈)

個人覺得這種題要不就切掉要不就爆0了,所以我們要大膽地猜結論,然後去證明。這也是一種思路吧 因為一次只能取走一顆石子,因此對於所有石子,我們能進行的操作總數就是 s 石子總數 石子堆數 1 我們可以感性地先猜一猜,如果考慮最簡單的情況一堆的話,那麼如果s是奇數那麼很顯然先手必勝,若是偶數那麼先手必敗...

NOI 2015 壽司晚宴

description 為了慶祝 noi 的成功開幕,主辦方為大家準備了一場壽司晚宴。小 g 和小 w 作為參加 noi 的選手,也被邀請參加了壽司晚宴。在晚宴上,主辦方為大家提供了 n 1 種不同的壽司,編號 1,2,3,n 1,其中第 i 種壽司的美味度為 i 1 即壽司的美味度為從 2 到 n...

NOI 2015 壽司晚宴

4197 noi2015 壽司晚宴 time limit 10 sec memory limit 512 mb submit 813 solved 508 submit status discuss description 為了慶祝 noi 的成功開幕,主辦方為大家準備了一場壽司晚宴。小 g 和小 ...