zoj 3547

来源:互联网 发布:百鸡问题的最简单算法 编辑:程序博客网 时间:2024/05/22 03:07

这题没啥好说的,就是1^4+2^4+3^4+...+n^4 这个公式找出来就行了,接下来就是容斥原理进行计算,hdu 4488 已经告诉我们怎么去递推系数了

zoj 3547

#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<queue>#include<iostream>#include<bitset>using namespace std;typedef long long ll;const int maxn = 10011111;const int N = 100001;const int mod = 1000000007;int p[N],size;bitset<100000>a;void init(){int i,j;a[0]=a[1]=1;for(i=2;i*i<=12000;++i){if(!a[i]){for(j=i*i;j<=12000;j+=i){a[j]=1;}}}for(i=2;i<=12000;++i){if(!a[i])p[size++]=i;}}int cnt,tsize;int c[1111];int f[1111];int d[1111];void dfs(int x,int k){if(x==tsize){d[cnt++]=k;return;}for(int i=0;i<=c[x];k*=f[x],++i){dfs(x+1,k);}}void spilt(int n){int i,t=n;cnt=tsize=0;memset(c,0,sizeof(c));for(i=0;1ll*p[i]*p[i]<=t&&i<size;++i){if(t%p[i]==0){f[tsize]=p[i];while(t%p[i]==0)c[tsize]++,t/=p[i];tsize++;}}if(t>1){f[tsize]=t;c[tsize]++;tsize++;}//dfs(0,1);}ll cal(ll a,int b){ll res=1,t=a;while(b){if(b&1) res=res*t%mod;t=t*t%mod;b>>=1;}return res;}ll go(ll n){ll ans=6ll*cal(n,5)+15ll*cal(n,4)+10ll*cal(n,3)-n;ans=ans*cal(30ll,mod-2)%mod;return ans;}ll ans;void gao(int x,int cnt,int mul,ll n){if(x<0){ll t=go(n/mul)*cal(mul,4)%mod;if(cnt&1)ans-=t;elseans+=t;return ;}else{gao(x-1,cnt,mul,n);gao(x-1,cnt+1,mul*f[x],n);}}int main(){init();int T,n;scanf("%d",&T);while(T--){scanf("%d",&n);spilt(n);ans=0;gao(tsize-1,0,1,n);ans=(ans%mod+mod)%mod;printf("%lld\n",ans);}return 0;}



这个程序是hdu 4488的,可以用来求解递推系数

import java.io.*;import java.util.*;import java.text.*;import java.math.*;public class Main {    public static void main(String args[]) {        new A().main();    }}class A {    Scanner cin = new Scanner(new BufferedInputStream(System.in));    PrintStream cout = System.out;    class fraction {        BigInteger a, b;        // public static fraction        public fraction(BigInteger a, BigInteger b) {            this.a = a;            this.b = b;        }        fraction multiply(fraction t) {            BigInteger m = t.a, n = t.b, p, q;            p = m.multiply(a);            q = n.multiply(b);            m = p.gcd(q);            p = p.divide(m);            q = q.divide(m);            return new fraction(p, q);        }        fraction add(fraction t) {            BigInteger m = t.a, n = t.b, p, q;            p = m.multiply(b);            p = p.add(n.multiply(a));            q = n.multiply(b);            m = p.gcd(q);            p = p.divide(m);            q = q.divide(m);            return new fraction(p, q);        }        fraction substract(fraction t) {            BigInteger m = t.a, n = t.b, p, q;            p = a.multiply(n);            p = p.subtract(m.multiply(b));            q = n.multiply(b);            m = p.gcd(q);            p = p.divide(m);            q = q.divide(m);            return new fraction(p, q);        }    }    fraction[][] f = new fraction[402][402];    BigInteger one = BigInteger.ONE;    BigInteger zero = BigInteger.ZERO;    BigInteger two = BigInteger.valueOf(2);    void main() {        int i, j;        for (i = 0; i <= 400; i++)            for (j = 0; j < i; j++)                f[i][j] = new fraction(zero, one);        for (i = 0; i <= 400; ++i) {            f[i][i + 1] = new fraction(one, BigInteger.valueOf(i + 1));            f[i][i] = new fraction(one, two);            f[i][0] = new fraction(one, zero);        }/*         * BigInteger a,b,c,d; a=cin.nextBigInteger(); b=cin.nextBigInteger();         * c=cin.nextBigInteger(); d=cin.nextBigInteger(); fraction p=new         * fraction(a,b); fraction q=new fraction(c,d); fraction         * res=p.substract(q); cout.println(res.a+" "+res.b);         */        fraction fone = new fraction(one, one);        for (i = 2; i <= 400; ++i) {            fraction tmp = new fraction(one, one);            for (j = 2; j < i; ++j) {                // cout.println(j+" "+i);                f[i][j] = f[i - 1][j - 1].multiply(new fraction(BigInteger                        .valueOf(i), BigInteger.valueOf(j)));                tmp = tmp.substract(f[i][j]);            }            tmp = tmp.substract(f[i][i]);            tmp = tmp.substract(f[i][i + 1]);            f[i][1] = tmp;        }        int n, m;        int T, p;        T=cin.nextInt();        for (int ca = 0; ca < T; ++ca) {            p = cin.nextInt();            n = cin.nextInt();            m = cin.nextInt();            cout.print(p + " " + f[n][m].a);            if (f[n][m].b.compareTo(one) > 0)                cout.print("/" + f[n][m].b);            cout.println("");        }    }}