通过对拍发现,一旦这个数据大于一个值(我也忘了,但是一个大于10000小于15000的数),那么它就会输出奇怪的东西。对于有些数它会输出
-1
-1
-1
...
3
5
对于有些数它会输出
3
3
3
...
7
9
还有对于一些数也输出不同的奇怪答案。
我这里 FFT 和 埃氏筛 是没有问题的,所以严重怀疑问题出在这一块。
m+=n*3; l=0;
for(n=1;n<=m;n*=2) l++;
for(int i=0;i<n;i++) r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
完整代码:
#include<bits/stdc++.h>
#define int long long
#define double long double
#define pi acos(-1)
#define round(a) ((a)>0?((int)(a+0.5)):((int)(a-0.5)))
using namespace std;
typedef complex<double> cp;
const int N=(1<<22)+5;
int n,m,l,r[N]; cp a[N],b[N],c[N],d[N];
void fft(cp *a,int type) {
for(int i=0;i<n;i++)
if(i<r[i]) swap(a[i],a[r[i]]);
for(register int i=1;i<n;i*=2){
cp dd(cos(pi/i),type*sin(pi/i));
for(register int j=0;j<n;j+=i*2){
cp b(1,0);
for(int k=0;k<i;k++,b*=dd){
cp x=a[j+k], y=b*a[i+j+k];
a[j+k]=x+y, a[i+j+k]=x-y;
}
}
}
}
bool vst[N];
void prime(int n){
for(register int i=2;i<=n;i++){
if(vst[i]) continue;
for(register int j=2;j<=n/i;j++) vst[j*i]=1;
}
}
signed main() {
freopen("UVA12298.in","r",stdin);
freopen("UVA12298.out","w",stdout);
prime(50000);
while(1) {
int ai,bi,ci;scanf("%lld%lld%lld",&ai,&bi,&ci);
n=m=bi;
memset(a,0,sizeof(b)), memset(b,0,sizeof(b)),
memset(c,0,sizeof(c)), memset(d,0,sizeof(d));
if(!ai&&!bi&&!ci) break;
for(register int i=0;i<=bi;i++) a[i]=b[i]=c[i]=d[i]=vst[i];
for(register int i=1;i<=ci;i++) {
int g; char ch; cin>>g>>ch;
if(ch=='S') a[g]=0;
else if(ch=='H') b[g]=0;
else if(ch=='C') c[g]=0;
else if(ch=='D') d[g]=0;
}
m+=n*3; l=0;
for(n=1;n<=m;n*=2) l++;
for(int i=0;i<n;i++) r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
fft(a,1), fft(b,1), fft(c,1), fft(d,1);
for(int i=0;i<=n;i++) a[i]=a[i]*b[i]*c[i]*d[i];
fft(a,-1);
for(int i=ai;i<=bi;i++) printf("%lld\n",round(a[i].real()/n));
puts("");
}
return 0;
}
望解答!