1. 程式人生 > >小Q與進位制

小Q與進位制

題目大意:有一種進位制,第i位的進位值是basei,然後現在給你一個數字a,問有多少數字不超過a,保證a有n位且最高位不為0,n120000。 題解:答案是:i=1naijibj,考慮將a和b的每一項理解為多項式去做分治法法塔,像維護雜湊一樣維護b的乘積和答案即可。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<vector>
#include<assert.h> #define lint long long #define db long double #define gc getchar() #define N 130000 #define BAS 100000//10000000 #define debug(x) cerr<<#x<<"="<<x #define sp <<" " #define ln <<endl using namespace std; const db PI=acos(-1); inline int inn() { int x,ch;while
((ch=gc)<'0'||ch>'9'); x=ch^'0';while((ch=gc)>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^'0');return x; } struct E{ db x,y;E(db _x=0,db _y=0) { x=_x,y=_y; } inline E operator+(const E &b)const { return E(x+b.x,y+b.y); } inline E operator+=(const E &b) { return
(*this)=(*this)+b; } inline E operator-(const E &b)const { return E(x-b.x,y-b.y); } inline E operator*(const E &b)const { return E(x*b.x-y*b.y,x*b.y+y*b.x); } inline E operator*=(const E &b) { return (*this)=(*this)*b; } };int r[N<<4];vector<E> a[N],b[N],t1,t2; inline int show(vector<E> &a,int t=1)//type = 0 : show number;else show polygon { int n=(int)a.size(); if(!t) { printf("%d",(int)a[n-1].x); for(int i=n-2;i>=0;i--) printf("%05d",(int)a[i].x);////////////////////////////////////////////////////////////////////////////////////////////////////// return printf("\n"),0; } for(int i=0;i<n;i++) cerr<<(int)a[i].x sp;cerr ln;return 0; } inline int FFT(vector<E> &a,int n,int sgn) { for(int i=1;i<n;i++) if(i>r[i]) swap(a[i],a[r[i]]); for(int i=1;i<n;i<<=1) { E wn(cos(PI/i),sgn*sin(PI/i)); for(int j=0,t=i<<1;j<n;j+=t) { E w(1,0); for(int k=0;k<i;k++,w*=wn) { E x=a[j+k],y=w*a[j+k+i]; a[j+k]=x+y,a[j+k+i]=x-y; } } } if(sgn<0) for(int i=0;i<n;i++) a[i].x/=n,a[i].y/=n;return 0; } inline int tms(vector<E> &a,vector<E> &b,vector<E> &c) { int m1=(int)a.size(),m2=(int)b.size(),n=1,L=0;for(;n<m1+m2-1;n<<=1,L++); for(int i=1;i<n;i++) r[i]=(r[i>>1]>>1)|((i&1)<<(L-1)); t1.resize(n);for(int i=0;i<n;i++) t1[i]=(i<m1?a[i]:E(0,0)); t2.resize(n);for(int i=0;i<n;i++) t2[i]=(i<m2?b[i]:E(0,0)); FFT(t1,n,1),FFT(t2,n,1);for(int i=0;i<n;i++) t1[i]*=t2[i]; FFT(t1,n,-1),c.resize(m1+m2-1);for(int i=0;i<m1+m2-1;i++) c[i]=t1[i]; return 0; } vector<lint> clt; int cc=0; inline int cl(vector<E> &a) { lint jw=0;int n=(int)a.size();clt.resize(n); for(int i=0;i<n;i++) clt[i]=(lint)(a[i].x+0.5); for(int i=0;i<n;i++) jw=(clt[i]+=jw)/BAS,clt[i]%=BAS; while(jw) clt.push_back(jw%BAS),jw/=BAS,n++; while(n>0&&!clt[n-1]) n--;if(!n) n=1,clt[0]=0;a.resize(n); for(int i=0;i<n;i++) a[i]=E(clt[i],0);return 0; } inline int solve(int l,int r) { if(l==r) return 0;int mid=(l+r)>>1;solve(l,mid),solve(mid+1,r); tms(b[l],a[mid+1],a[mid+1]),tms(b[l],b[mid+1],b[l]); int L=(int)a[l].size(),R=(int)a[mid+1].size(),k=max(L,R); a[l].resize(k);for(int i=L;i<k;i++) a[l][i]=E(0,0); a[r].resize(k);for(int i=R;i<k;i++) a[mid+1][i]=E(0,0); for(int i=0;i<(int)a[l].size();i++) a[l][i]+=a[mid+1][i]; cl(a[l]),cl(b[l]); return 0; } int main() { int n=inn(); for(int i=1;i<=n;i++) b[i].push_back(inn()),cl(b[i]); for(int i=1;i<=n;i++) a[i].push_back(inn()),cl(a[i]); return solve(1,n),show(a[1],0),0; }