一开始写的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]) return 1;
else return 2;
}
void work(ll k,ll q)
{
if (k==0) return;
work(k/2,q*2);
if (k%2==1)
{
memset(b,0,sizeof(b));
for (ll j=1;j<=n*2;j++)
b[j]=f(j,q);
swap(a,b);
}
}
int main()
{
scanf("%lld%lld",&n,&t);
for (ll i=1;i<=n;i++)
scanf("%lld",&a[i*2-1]);
work(t,1);
for (ll i=1;i<n*2;i++)
printf("%d ",a[i]);
printf("%lld\n",a[n*2]);
}