一开始写的m^2暴力,写完了才发现n<=10 0000.
这道题百度上居然只有2个题解。。。
膜完题解,这规律能找到也是厉害
对于样例,进行数学归纳,发现2^k变换之后,第i个位置的硬币情况只与它左右的第k+1个硬币有关。
如k=0,第3位硬币情况只与2和4位硬币有关。因为t可以拆成若干个2^k的和,于是对每个2^k进行O(n)的变换,总复杂度O(nlogt)。
注意开long long。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define ll long long
using namespace std;
ll n,t,a[200000],b[200000];
ll f(ll b,ll k)
{
ll x=b-k,y=b+k;
x=(x%(n*2)+n*2-1)%(n*2)+1;
y=(y-1)%(n*2)+1;
if (k==0) return a[x];
if (a[x]==0) return 0;
if (a[x]==a[y]) ret