刚学多项式,有个奇怪的问题--为什么我这里一到大数就会出现奇怪的事情
查看原帖
刚学多项式,有个奇怪的问题--为什么我这里一到大数就会出现奇怪的事情
180652
_lgswdn楼主2020/6/6 22:31

通过对拍发现,一旦这个数据大于一个值(我也忘了,但是一个大于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;
}

望解答!

2020/6/6 22:31
加载中...