zoukankan      html  css  js  c++  java
  • 「刷题」一个人的数论

    一个人的数论,这题也昨晚好久了,是另外一道神题。

    #include<cstdio>
    #include<iostream>
    using namespace std;
    typedef long long ll;
    const ll mod=1e9+7,maxn=1005,maxd=105;
    ll d,w,p[maxn],pk[maxn],z[maxn],a[maxd][maxd],b[maxd],x[maxd];
    ll qw(ll a,ll b)
    {
        ll ans=1;
        for(;b;b>>=1,a=a*a%mod) if(b&1) ans=ans*a%mod;
        return ans;
    }
    ll abs(ll a)
    {
        return a>0?a:-a;
    }
    void Guass()
    {
        for(int i=1;i<=d+1;i++)
        {
            for(int j=1;j<=d+1;j++) a[i][j]=qw(i,j);
            for(int j=1;j<=i;j++) b[i]=(b[i]+qw(j,d))%mod;
        }
        for(int i=1;i<=d+1;i++)
        {
            int q=i;
            for(int j=i+1;j<=d+1;j++)
                if(abs(a[j][i])>abs(a[q][i]))
                    q=j;
            for(int j=1;j<=d+1;j++) swap(a[i][j],a[q][j]);
            swap(b[i],b[q]);
            if(a[i][i]==0) continue;
            ll inv=qw(a[i][i],mod-2);
            for(int j=1;j<=d+1;j++)
                if(i!=j)
                {
                    ll r=a[j][i]*inv%mod;
                    for(int k=1;k<=d+1;k++) a[j][k]=((a[j][k]-a[i][k]*r%mod)%mod+mod)%mod;
                    b[j]=((b[j]-1LL*b[i]*r%mod)%mod+mod)%mod;
                }
        }
        for(int i=d+1;i>=1;i--)
        {
            for(int j=i+1;j<=d+1;j++) b[i]=((b[i]-x[j]*a[i][j]%mod)%mod+mod)%mod;
            ll inv=qw(a[i][i],mod-2);
            x[i]=b[i]*inv%mod;
        }
    }
    ll donit()
    {
        ll ans=0;
        for(int i=1;i<=d+1;i++)
        {
            ll res=x[i];
            for(int j=1;j<=w;j++) 
            {
                ll k1=pk[j]*i%(mod-1),k2=(k1+d-i)%(mod-1);
                ll t=((qw(p[j],k1)-qw(p[j],k2))%mod+mod)%mod;
                res=res*t%mod;
            }
            ans=(ans+res)%mod;
        }
        return ans;
    }
    int main()
    {
        scanf("%lld%lld",&d,&w);
        Guass();
        for(int i=1;i<=w;i++) scanf("%lld%lld",&p[i],&pk[i]);
        printf("%lld
    ",donit());
        return 0;
    }
    View Code
  • 相关阅读:
    Spring源码加载BeanDefinition过程
    设计模式之☞委派模式,通俗易懂,一学就会!!!
    SpringMvc 跨域处理
    寻找全排列的下一个数
    使用两个栈实现队列
    无序数组在排序后的最大相邻查
    判断一个数是否是2的幂
    最大公约数
    最小栈的实现
    js 原型与原型链
  • 原文地址:https://www.cnblogs.com/Lrefrain/p/11222774.html
Copyright © 2011-2022 走看看