2194 快速傅利葉之二

2022-05-12 09:34:29 字數 1778 閱讀 2520

請計算c[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,並且有 n < = 10 ^ 5。 a,b中的元素均為小於等於100的非負整數。

第一行乙個整數n,接下來n行,第i+2..i+n-1行,每行兩個數,依次表示a[i],b[i] (0 < = i < n)。

輸出n行,每行乙個整數,第i行輸出c[i-1]。

53 1

2 41 1

2 41 4

2412106

1卷積是要求兩個下標的和是定值,這道題的差是定值,這樣就可以將其中乙個陣列翻轉,然後fft。。。

1 #include2 #include3 #include4 #include5 #include6 #include7 #include

8 #include9 #include10 #include11 #include

12#define inf 1000000000

13#define maxn 266333

14#define maxm 10000+5

15#define eps 1e-10

16#define ll long long

17#define for0(i,n) for(int i=0;i<=(n);i++)

18#define for1(i,n) for(int i=1;i<=(n);i++)

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

20#define for3(i,x,y) for(int i=(x);i>=(y);i--)

21#define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)

22using

namespace

std;

23int

read()

26while(ch>='

0'&&ch<='9')

27return x*f;28}

29struct

cp;}

32 cp operator -(cp b);}

33 cp operator *(cp b);}

34};

35const

double pi=acos(-1.0

);36

cp a[maxn],b[maxn],c[maxn],y[maxn];

37int

n,m,len,rev[maxn],ans[maxn];

38char

s[maxn];

39void fft(cp *x,int n,int

flag);

44for(int i=0;im);int mid=m>>1

;46 for0(j,mid-1)51

}52}53

if(flag==-1)for0(i,n-1)x[i].x/=n;54}

55int

main()

68 fft(a,n,1);fft(b,n,1

);69 for0(i,n-1)c[i]=a[i]*b[i];

70 fft(c,n,-1

);71 for3(i,(m-1)>>1,0

)72 printf("

%lld\n

",(ll)(c[i].x+0.5

));73

return0;

74 }

view code

2194 快速傅利葉之二

time limit 10 sec memory limit 259 mb submit 1078 solved 619 submit status discuss 請計算c k sigma a i b i k 其中 k i n 並且有 n 10 5。a,b中的元素均為小於等於100的非負整數。第一...

bzoj 2194 快速傅利葉之二

time limit 10 sec memory limit 259 mb submit 1314 solved 772 submit status discuss 請計算c k sigma a i b i k 其中 k i n 並且有 n 10 5。a,b中的元素均為小於等於100的非負整數。第一...

BZOJ 2194 快速傅利葉之二

已知 a,b a,b 序列,計算 ck ai bi k ck ai bi k 觀察題目名稱,可以想到fft fft能解決的是形如下面的式子 hk fi gk i hk fi gk i 可以發現,f f 陣列的下標和 g role presentation style position relativ...