牛客多校(一)B.ntegration

题目链接:B.ntegration

题目大意:已知\int_{0}^{\infty }\frac{1}{1+x^{2}}dx=\frac{\pi }{2},计算\frac{1}{\pi }\int_{0}^{\infty }\frac{1}{\prod _{i=1}^{n}(a_{i}^{2}+x^{2})}dx

思路:考虑到在《信号与系统》这门课中才学过

F(s)=\frac{A(s)}{B(s)}=\frac{A(s)}{p(s-s_{1})(s-s_{2})...(s-s_{n})}=\sum_{1}^{n}\frac{K_{i}}{s-s_{i}}

其中K_{i}=(s-s_{i})\frac{A(s)}{B(S)}|_{s=s_{i}}

而在本题中就可令s=x^{2},s_{i}=-a_{i}^2 

\int_{0}^{\infty }\frac{1}{\prod _{i=1}^{n}(a_{i}^{2}+x^{2})}dx=\int_{0}^{\infty }\sum_{1}^{n}\frac{K_i}{(a_{i}^{2}+x^{2})}dx=\sum_{1}^{n}\frac{K_i}{a_i}\int_{0}^{\infty }\frac{1}{1+(\frac{x}{a_i})^2}d\frac{x}{a_i}

即原式等=\sum_{1}^{n}\frac{K_i\pi }{2a_i}

其中K_{i}=(s-s_{i})\frac{A(s)}{B(S)}|_{s=s_{i}}=\frac{A(s)}{\prod _{i\neq j}(s-s_j)}|_{s=s_i}=\frac{1}{\prod _{i\neq j}(a_j^2-a_i^2)}

接下来就是求逆元得操作,代码里看

代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
typedef long long ll;
using namespace std;
#define INF 0x3f3f3f3f
const int mod=1e9+7;
const int maxn=1e3+10;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
int n;
ll a[maxn];
//int inv(int t,int p){return t==1?1:(p-p/t)*inv(p%t,p)%p;}
ll pow_mod(ll a,ll b,ll p){
    ll res=1;
    while(b){
        if(b&1)res=(res*a)%p;
        a=(a*a)%p;
        b>>=1;
    }
    return res;
}
ll fermat(ll a,ll p){
    return pow_mod(a,p-2,p);
}
int main()
{
    while(~scanf("%d",&n)){
        for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
        ll ans=0;
        for(int i=1;i<=n;i++){
            ll k=1;
            for(int j=1;j<=n;j++){
                if(i==j)continue;
                k=k*((a[j]*a[j]-a[i]*a[i])%mod+mod)%mod;
            }
            k=fermat(k,mod);
            k=k*fermat(a[i]*2,mod)%mod;
            ans=(ans+k)%mod;
        }
        printf("%lld\n",ans );
    }
    return 0;
}


据说还有复变函数里留数的做法(凭借我学复变的记忆貌似原理差不多),还有神人matlab解方程···

通过这道题也算复习了一下高数知识。
 

你可能感兴趣的:(牛客多校,数学相关)