zoukankan      html  css  js  c++  java
  • BZOJ 3601 一个人的数论 (拉格朗日插值+莫比乌斯反演)

    题意

    题解

    orz Freopen的博客

    CODE

    #pragma GCC optimize (3)
    #include <bits/stdc++.h>
    using namespace std;
    char cb[1<<15],*cs=cb,*ct=cb;
    #define getc() (cs==ct&&(ct=(cs=cb)+fread(cb,1,1<<15,stdin),cs==ct)?0:*cs++)
    void read(int &res){
    	char ch; for(;!isdigit(ch=getc()););
    	for(res=ch-'0';isdigit(ch=getc());res=res*10+ch-'0');
    }
    const int MAXD = 105;
    const int MAXN = 1005;
    const int mod = 1e9 + 7;
    int d, n, p[MAXN], a[MAXN];
    
    int inv[MAXD], invf[MAXD], rinv[MAXD];
    int y[MAXD], cf[MAXD], dp[MAXD];
    
    inline int qpow(int a, int b) {
    	int re = 1;
    	while(b) {
    		if(b&1) re = 1ll * re * a % mod;
    		a = 1ll * a * a % mod; b >>= 1;
    	}
    	return re;
    }
    
    int main () {
    	read(d), read(n);
    	for(int i = 1; i <= n; ++i) read(p[i]), read(a[i]);
    	dp[0] = 1;
    	for(int i = 1; i <= d+2; ++i) {
    		y[i] = (y[i-1] + qpow(i, d)) % mod;
    		for(int j = d+2; j >= 0; --j)
    			dp[j] = ((j ? dp[j-1] : 0) - 1ll * dp[j] * i) % mod;
    	}
    	inv[0] = invf[0] = rinv[0] = 1;
    	inv[1] = invf[1] = 1; rinv[1] = -1;
    	for(int i = 2; i <= d+2; ++i)
    		inv[i] = 1ll * (mod - mod/i) * inv[mod%i] % mod,
    		invf[i] = 1ll * invf[i-1] * inv[i] % mod,
    		rinv[i] = 1ll * rinv[i-1] * (-inv[i]) % mod;
    	for(int i = 1; i <= d+2; ++i) {
    		for(int j = 0; j <= d+2; ++j) {
    			dp[j] = 1ll * ((j ? dp[j-1] : 0) - dp[j]) * inv[i] % mod;
    			cf[j] = (cf[j] + 1ll * dp[j] * invf[i-1] % mod * rinv[d+2-i] % mod * y[i]) % mod;
    		}
    		for(int j = d+2; j >= 0; --j)
    			dp[j] = ((j ? dp[j-1] : 0) - 1ll * dp[j] * i % mod) % mod;
    	}
    	int ans = 0;
    	for(int i = 0; i <= d+1; ++i) {
    		int tmp = 1;
    		for(int j = 1; j <= n; ++j)
    			tmp = 1ll * tmp * (qpow(qpow(p[j], a[j]), i) - 1ll * qpow(p[j], d) * qpow(qpow(p[j], a[j]-1), i) % mod) % mod;
    		ans = (ans + 1ll * tmp * cf[i] % mod) % mod;
    	}
    	printf("%d
    ", (ans + mod) % mod);
    }
    
  • 相关阅读:
    jchdl
    jchdl
    UVa 10256 (判断两个凸包相离) The Great Divide
    UVa 11168 (凸包+点到直线距离) Airport
    LA 2572 (求可见圆盘的数量) Kanazawa
    UVa 10652 (简单凸包) Board Wrapping
    UVa 12304 (6个二维几何问题合集) 2D Geometry 110 in 1!
    UVa 10674 (求两圆公切线) Tangents
    UVa 11796 Dog Distance
    LA 3263 (平面图的欧拉定理) That Nice Euler Circuit
  • 原文地址:https://www.cnblogs.com/Orz-IE/p/12039203.html
Copyright © 2011-2022 走看看