社区讨论

多项式开根求卡常

P12695序列游戏参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mj6uiykq
此快照首次捕获于
2025/12/15 15:42
2 个月前
此快照最后确认于
2025/12/15 15:56
2 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
const int N = 1e6+5;
namespace poly{
	const int P = 998244353, G = 3, Gi = 332748118;
	int qpow(int a, int b, int p){
		int res = 1;
		while (b){
			if (b & 1) res = res * a % p;
			a = a * a % p;
			b >>= 1;
		}
		return res;
	}
	int lim, L, rev[N];
	void NTT(int *f, int g){
		for (int i = 0;i < lim;i++) if (i < rev[i]) swap(f[i], f[rev[i]]);
		for (int len = 1;len < lim;len <<= 1){
			int wn = qpow(g, (P - 1) / (len << 1), P);
			for (int i = 0;i < lim;i += (len << 1)){
				for (int j = 0, w = 1;j < len;j++, w = w * wn % P){
					int x = f[i + j], y = w * f[i + j + len] % P;
					f[i + j] = (x + y) % P;
					f[i + j + len] = (x - y + P) % P;
				}
			}
		}
	}
	void Mul(int n, int m, int *f, int *g, int *c){
		for (lim = 1, L = 0;lim <= n + m;lim <<= 1, ++L) ;
		for (int i = 0;i < lim;i++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << L - 1);
		NTT(f, G), NTT(g, G);
		for (int i = 0;i < lim;i++) f[i] = f[i] * g[i] % P;
		NTT(f, Gi);
		int inv = qpow(lim, P - 2, P);
		for (int i = 0;i <= n + m;i++) c[i] = f[i] * inv % P;
	}
	void Pow2(int n, int *f, int *c){
		for (lim = 1, L = 0;lim <= n << 1;lim <<= 1, ++L) ;
		for (int i = 0;i < lim;i++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << L - 1);
		NTT(f, G);
		for (int i = 0;i < lim;i++) f[i] = f[i] * f[i] % P;
		NTT(f, Gi);
		int inv = qpow(lim, P - 2, P);
		for (int i = 0;i <= n << 1;i++) c[i] = f[i] * inv % P;
	}
	void Inv(int n, int *F, int *c){
		static int a[N], f[N];
		a[0] = qpow(F[0], P - 2, P), a[1] = 0;
		for (int b = 2;(b >> 1) <= n;b <<= 1){
			for (int i = 0;i < b;i++) f[i] = F[i];
			for (int i = b;i < b << 1;i++) f[i] = 0;
			Pow2((b >> 1) - 1, a, a);
			Mul(b - 1, b - 2, f, a, a);
			for (int i = b >> 1;i < b;i++) a[i] = (P - a[i]) % P;
			for (int i = b;i < b << 1;i++) a[i] = 0;
		}
		for (int i = 0;i <= n;i++) c[i] = a[i];
		for (int i = n + 1;i < lim;i++) c[i] = 0;
		for (int i = 0;i < lim;i++) a[i] = f[i] = 0;
	}
	void Ln(int n, int *f, int *c){
		static int a[N], b[N];
		for (int i = 1;i <= n;i++) a[i - 1] = f[i] * i % P;
		Inv(n, f, b);
		Mul(n, n, a, b, c);
		for (int i = n;i;i--) c[i] = c[i - 1] * qpow(i, P - 2, P) % P;
		c[0] = 0;
		for (int i = n + 1;i < lim;i++) c[i] = 0; 
		for (int i = 0;i < lim;i++) a[i] = b[i] = 0;
	}
	void Exp(int n, int *f, int *g){
		if (n == 0) return g[0] = 1, void();
		Exp(n >> 1, f, g);
		static int a[N], b[N];
		Ln(n, g, a);
		for (lim = 1, L = 0;lim <= n << 1;lim <<= 1, ++L) ;
		for (int i = 0;i < lim;i++) rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << L - 1);
		for (int i = 0;i <= n;i++) b[i] = f[i];
		for (int i = n + 1;i < lim;i++) a[i] = b[i] = 0;
		for (int i = 0;i < lim;i++) b[i] = (b[i] - a[i] + P) % P;
		++b[0];
		NTT(g, G), NTT(b, G);
		for (int i = 0;i < lim;i++) g[i] = g[i] * b[i] % P, a[i] = b[i] = 0;
		NTT(g, Gi);
		int inv = qpow(lim, P - 2, P);
		for (int i = 0;i < lim;i++) g[i] = g[i] * inv % P;
		for (int i = n + 1;i < lim;i++) g[i] = 0;
	}
	void Pow(int n, int *f, ll k){
		static int g[N];
		Ln(n, f, g);
		for (int i = 0;i <= n;i++) g[i] = g[i] * k % P, f[i] = 0;
		Exp(n, g, f);
	}
    void iPow(int n, int *f, int k){
        static int g[N];
		Ln(n, f, g);
        int t = qpow(k, P - 2, P);
		for (int i = 0;i <= n;i++) g[i] = g[i] * t % P, f[i] = 0;
		Exp(n, g, f);
    }
/*
n shi duo xiang shi ci shu
Exp qian gei g qing 0
*/
}
using poly::P;
int c, n;
ll a[N], b[N];
namespace sub_1{
    void solve(){
        for (int i = 1;i <= n;i++) cout << a[i] + b[i] << ' ';
    }
}
namespace sub_2{
    void solve(){
        for (int i = 1;i <= n;i++) cout << a[i] - b[i] << ' ';
    }
}
namespace sub_3{
    void solve(){
        for (int i = 1;i <= n;i++){
            cout << (a[i] ^ b[i]) << ' ';
        }
    }
}
namespace sub_4{
    void solve(){
        for (int i = 1;i <= n;i++){
            cout << (a[i] | b[i]) << ' ';
        }
    }
}
namespace sub_5{
    void solve(){
        for (int i = 1;i <= n;i++){
            cout << (a[i] & b[i]) << ' ';
        }
    }
}
namespace sub_6{
    int F[N], G[N], H[N];
    void solve(){
        --n;
        for (int i = 0;i <= n;i++) F[i] = a[i + 1];
        for (int i = 0;i <= n;i++) G[i] = b[i + 1];
        for (int i = 0;i <= n;i++) F[i] = (F[i] + P) % P;
		for (int i = 0;i <= n;i++) G[i] = (G[i] + P) % P;
        poly::Mul(n, n, F, G, H);
        for (int i = 0;i <= 2 * n;i++) cout << H[i] << ' ';
    }
}
namespace sub_7{
    int F[N], G[N], H[N], L[N];
    void solve(){
        for (int i = 0;i < n;i++) F[i] = a[i + 1];
        for (int i = 0;i < n;i++) G[i] = b[i + 1];
        for (int i = 0;i < n;i++) F[i] = (F[i] % P + P) % P;
		for (int i = 0;i < n;i++) G[i] = (G[i] % P + P) % P;
        n = n * 2 - 1 ;
        poly::Inv(n, G, H);
        poly::Mul(n, n, F, H, L);
        for (int i = 0;i <= n;i++) cout << L[i] << ' ';
    }
}
namespace sub_8{
    int F[N], G[N], H[N];
    void solve(){
        for (int i = 0;i < n;i++) F[i] = a[i + 1];
        for (int i = 0;i < n;i++) F[i] = (F[i] % P + P) % P;
        n = n * 2 - 1 ;
        poly::iPow(n, F, 3);
        for (int i = 0;i <= n;i++) cout << F[i] << ' ';
    }
}
namespace sub_9{
    void solve(){
        for (int i = 1;i <= n;i++) cout << a[b[i]] << ' ';
    }
}
namespace sub_10{
    void solve(){
        for (int i = 1;i <= n;i++) b[i] = i  ;
        sort(b + 1 , b + 1 + n , [&] ( int x , int y) {return a[x] == a[y] ? x < y : a[x] < a[y] ; } ) ;
        for (int i = 1;i <= n;i++) cout << b[i] << ' ' ;
    }
}
namespace sub_11{
	pair<int, int> qq[N];
	void solve(){
		for (int i = 1;i <= n;i++) qq[i] = {a[i], i};
		sort(qq + 1, qq + 1 + n);
		for (int i = 1;i <= n;i++) a[qq[i].second] = i;
		for (int i = 1;i <= n;i++) cout << a[i] << ' ';
	}
}
namespace sub_12{
	void solve(){
        cout << "62652476986945811929574508085753525213325243476748757638370409819051066331429819908604545880040736669362770937694609989560289409637253984209373160098134477290043961183590474128343974265063328000"; 
	}
}
namespace sub_13{
	void solve(){
        double ans = 0;
        for (int i = 2;i <= n;i++){
            double x = (a[i] - a[i - 1]) , y = b[i] - b[i - 1];
            ans += sqrt(x * x + y * y);
        }
        cout << fixed << setprecision(2) << ans;
    }
}
namespace sub_14{
    double avx;
	void solve(){
        for (int i = 1;i <= n;i++){
            avx += a[i] - b[i];
        }
        avx /= n;
        double sum = 0;
        for (int i = 1;i <= n;i++){
            sum += (avx - a[i] + b[i]) * (avx - a[i] + b[i]);
        }
        sum /= n;
        cout << fixed << setprecision(2) << sum ; 
    }
}
namespace sub_15{
    double x[N], y[N], m, sxy, sx, sy, sx2, sy2;
	void solve(){
        for (int i = 1;i <= n;i++){
            x[i] = a[i], y[i] = b[i];
            sxy += x[i] * y[i];
            sx += x[i];
            sy += y[i];
            sx2 += x[i] * x[i];
            sy2 += y[i] * y[i];
        }
        m = (n * sxy - sx * sy) / (n * sx2 - sx * sx);
        double k;
        k = (sy - m * sx) / n;
        cout << "k=" << fixed << setprecision(2) << m << ' ';
        cout << "b=" << fixed << setprecision(2) << k;
    }
}
namespace sub_16{
	bool vis[5002][5002];
	void solve(){
		ll mx = 0;
		for (int i = 1;i <= n;i++){
			vis[a[i]][b[i]] = 1;
			mx = max(mx, a[i]);
			mx = max(mx, b[i]);
		}
		for (int i = 0;i <= mx;i++){
			for (int j = 0;j <= mx;j++){
				cout << vis[i][j] << ' ';
			}
			cout << '\n';
		}
	}
}
namespace sub_17{
    #define db double
    struct node{
        db x,y;
        inline const bool operator<(const node &p)const{
            return x==p.x?y<p.y:x<p.x;
        }
        inline const node operator-(const node p)const{
            return node{x-p.x,y-p.y};
        }
        inline const db operator *(const node p)const{
            return y*p.x-x*p.y;
        }
    }p[N],ans[N];
    int stk[N],tp,cnt;
    bool used[N];
    db anser;
    inline db dis(node p,node q){
        return sqrt((p.x-q.x)*(p.x-q.x)+(p.y-q.y)*(p.y-q.y));
    }
    db sqr(node a, node b, node c){
        double l1, l2, l3;
        l1 = dis(a, b);
        l2 = dis(b, c);
        l3 = dis(a, c);
        double p = (l1 + l2 + l3) / 2;
        double S = p * (p - l1) * (p - l2) * (p - l3);
        return sqrt(S);
    }
	void solve(){
        for (int i = 1;i <= n;i++) p[i].x = a[i];
        for (int i = 1;i <= n;i++) p[i].y = b[i];
		sort(p+1,p+1+n);
        stk[++tp]=1;
        for(int i=2;i<=n;i++){
            while(tp>1 and (p[stk[tp]]-p[stk[tp-1]])*(p[i]-p[stk[tp-1]])<=0)used[stk[tp--]]=0;
            stk[++tp]=i;used[i]=1;
        }
        int tmp=tp;
        for(int i=n-1;i;i--){
            if(!used[i]){
                while(tp>tmp and (p[stk[tp]]-p[stk[tp-1]])*(p[i]-p[stk[tp-1]])<=0)used[stk[tp--]]=0;
                used[i]=1;
                stk[++tp]=i;
            }
        }
        cnt=tp; cnt -- ;
        for(int i=1;i<=cnt;i++)ans[i]=p[stk[i]];
        double Z = 0 ; 
        for (int j = 2;j < cnt ; j++ ) {
            Z += sqr(ans[1] , ans[j] , ans[j + 1] ) ; 
        }
        cout << fixed << setprecision(2) << Z;
	}
}
namespace sub_18{
    int F[N], G[N], H[N];
    void solve(){
        for (int i = 0;i < n;i++) F[i] = a[i + 1];
        for (int i = 0;i < n;i++) F[i] = (F[i] % P + P) % P;
        n = n * 2 - 1 ;
        poly::iPow(n, F, 2);
        for (int i = 0;i <= n;i++) cout << F[i] << ' ';
    }
}
namespace sub_19{
	void solve(){
		ll sa = 0;
		for (int i = 1;i <= n;i++) sa ^= a[i] ^ b[i];
		if (sa > 0) cout << "Win!";
		else cout << "Lose!";
	}
}
namespace sub_20{
	void solve(){
		for (int i = 1;i <= n;i++) cout << a[i] << ' ';
		for (int i = 1;i <= n;i++) cout << b[i] << ' ';
	}
}
namespace tianyu{
	void awa(){
		cin >> c >> n;
		for (int i = 1;i <= n;i++) cin >> a[i];
		for (int i = 1;i <= n;i++) cin >> b[i];
        if (c == 1) sub_1::solve();
        if (c == 2) sub_2::solve();
        if (c == 3) sub_3::solve();
        if (c == 4) sub_4::solve();
        if (c == 5) sub_5::solve();
        if (c == 6) sub_6::solve();
        if (c == 7) sub_7::solve();
        if (c == 8) sub_8::solve();
        if (c == 9) sub_9::solve();
        if (c == 10) sub_10::solve();
		if (c == 11) sub_11::solve();
        if (c == 12) sub_12::solve();
        if (c == 13) sub_13::solve();
        if (c == 14) sub_14::solve();
        if (c == 15) sub_15::solve();
		if (c == 16) sub_16::solve();
        if (c == 17) sub_17::solve();
        if (c == 18) sub_18::solve();
		if (c == 19) sub_19::solve();
		if (c == 20) sub_20::solve();
	}
}
signed main(){
    cin.tie(0)->sync_with_stdio(false);
    // freopen("game.in", "r", stdin);
    // freopen("game.out", "w", stdout);
	int T = 1;
	while (T--) tianyu::awa();
	return 0;
}
sub18 被卡了/ll

回复

0 条回复,欢迎继续交流。

正在加载回复...