全RE求调
查看原帖
全RE求调
678867
Ke9_qux楼主2024/7/25 13:33

高精板子

#include <bits/stdc++.h>
using namespace std;

#define ll long long
const int MAXLEN=1e3;
const int jinzhi=1e8;

struct BInt {
	ll d[MAXLEN+1];
	BInt() {memset(d,0,sizeof(d));}
	BInt(ll n) {
		memset(d,0,sizeof(d));
		while(n) {
			d[++d[0]]=n%jinzhi;
			n/=jinzhi;
		}
	}
	BInt(string str) {
		memset(d,0,sizeof(d));
		for(int i=str.size()-1;i>=0;i-=8) {
			d[0]++;
			for(int j=min(7,i);j>=0;j--) {
				if(i-j<0) break;
				d[d[0]]=d[d[0]]*10+str[i-j]-'0';
			}
		}
	}
	BInt operator=(ll n) {
		memset(d,0,sizeof(d));
		while(n) {
			d[++d[0]]=n%jinzhi;
			n/=jinzhi;
		}
		return *this;
	}
	BInt operator=(string str) {
		memset(d,0,sizeof(d));
		for(int i=str.size()-1;i>=0;i-=8) {
			d[0]++;
			for(int j=min(7,i);j>=0;j--) {
				if(i-j<0) break;
				d[d[0]]=d[d[0]]*10+str[i-j]-'0';
			}
		}
		return *this;
	}
	void print(string step="\n") {
		if(d[0]==0) {
			cout<<0<<step;
			return;
		}
		for(int i=d[0];i>=1;i--) {
			if(i==d[0]) printf("%lld",d[i]);
			else printf("%08lld",d[i]);
		}
		cout<<step;
	}
	void read() {
		string str;
		cin>>str;
		memset(d,0,sizeof(d));
		for(int i=str.size()-1;i>=0;i-=8) {
			d[0]++;
			for(int j=min(7,i);j>=0;j--) {
				if(i-j<0) break;
				d[d[0]]=d[d[0]]*10+str[i-j]-'0';
			}
		}
	}
	BInt operator+(BInt n) {
		BInt res(0);
		int maxl=max(n.d[0],d[0]);
		for(int i=1;i<=maxl;i++) {
			res.d[i]=d[i]+n.d[i];
		}
		for(int i=1;i<=maxl;i++) {
			res.d[i+1]+=res.d[i]/jinzhi;
			res.d[i]%=jinzhi;
		}
		res.d[0]=maxl+(res.d[maxl+1]>0);
		return res;
	}
	BInt operator-(BInt n) {
		BInt res(0);
		if(d[0]<n.d[0]) return res;
		for(int i=d[0];i>=1;i--) {
			res.d[i]=d[i]-n.d[i];
		}
		for(int i=d[0];i>=1;i--) {
			if(res.d[i]<0) {
				res.d[i]+=jinzhi;
				res.d[i+1]--;
			}
		}
		res.d[0]=d[0]-(res.d[d[0]]==0);
		return res;
	}
	BInt operator*(BInt n) {
		BInt res(0);
		int len=d[0]+n.d[0]-1;
		for(int i=1;i<=d[0];i++) {
			for(int j=1;j<=n.d[0];j++) {
				res.d[i+j-1]+=d[i]*n.d[j];
			}
		}
		for(int i=1;i<=len;i++) {
			res.d[i+1]+=res.d[i]/jinzhi;
			res.d[i]%=jinzhi;
		}
		res.d[0]=len+(res.d[len+1]>0);
		return res;
	}
	BInt operator/(int n) {
		BInt res=*this;
		for(int i=d[0];i>=1;i--) {
			ll q=res.d[i]/n;
			ll r=res.d[i]-q*n;
			res.d[i]=q;
			res.d[i-1]+=r*jinzhi;
		}
		res.d[0]=d[0]-(res.d[d[0]]==0);
		return res;
	}
	BInt qpow(int n) {
		if(n==1) return *this;
		BInt t=qpow(n/2);
		if(n%2==0) return t*t;
		return t*t*(*this);
	}
	bool operator==(BInt n) {
		if(d[0]!=n.d[0]) return 0;
		for(int i=1;i<=d[0];i++) {
			if(d[i]!=n.d[i]) return 0;
		}
		return 1;
	}
	bool operator<(BInt n) {
		if(d[0]!=n.d[0]) return d[0]<n.d[0];
		for(int i=d[0];i>=1;i--) {
			if(d[i]>n.d[i]) return 0;
			if(d[i]<n.d[i]) return 1;
		}
		return 0;
	}
	bool operator>(BInt n) {
		if(d[0]!=n.d[0]) return d[0]>n.d[0];
		for(int i=d[0];i>=1;i--) {
			if(d[i]<n.d[i]) return 0;
			if(d[i]>n.d[i]) return 1;
		}
		return 0;
	}
};

vector<BInt> d(vector<BInt> f) {
	if(f.size()==1) {
		vector<BInt> res;
		res.push_back(0);
		return res;
	}
	vector<BInt> res(f.size()-1);
	for(int i=f.size()-1;i>=1;i--) {
		res[i-1]=f[i]*i;
	}
	return res;
}

BInt s(vector<BInt> f,int x) {
	BInt w=1,res=0;
	for(int i=0;i<f.size();i++) {
		res=res+w*f[i];
		w=w*x;
	}
	return res;
}

int main() {
	int n,k;
	scanf("%d %d\n",&n,&k);
	vector<BInt> f(n+1);
	scanf("f(x)=");
	for(;;) {
		int c=0,p=0;
		char ch=getchar();
		if(ch=='x') {
			ch=getchar();			// ^
			ch=getchar();
			while(ch>='0'&&ch<='9') {
				p=p*10+ch-'0';
				ch=getchar();
			}
			f[p]=f[p]+1;
			if(ch=='\n') break;
			continue;
		}
		while(ch>='0'&&ch<='9') {
			c=c*10+ch-'0';
			ch=getchar();
		}
		ch=getchar();				// ^
		ch=getchar();
		while(ch>='0'&&ch<='9') {
			p=p*10+ch-'0';
			ch=getchar();
		}
		f[p]=f[p]+c;
		if(ch=='\n') break;
	}
	while(k--) f=d(f);
	int m;
	cin>>m;
	while(m--) {
		int q;
		cin>>q;
		s(f,q).print("\n");
	}
	return 0;
}

2024/7/25 13:33
加载中...