Project Eular 632/633

先討論一下632ios

咱們先求一遍,而後容斥spa

先求一遍的時候,咱們對於每一個數xblog

若是x的因子裏面帶平方,那麼就忽略掉,不然就在ans[x的因子個數]上加(1016/x2)的答案string

以後容斥,咱們就能夠求出這個答案it

#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<time.h>
#include<math.h>
#include<memory>
#include<vector>
#include<bitset>
#include<fstream>
#include<stdio.h>
#include<utility>
#include<sstream>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int ans[100000005];
int last_p[100000005];
const long long n=100000000ll*100000000;
long long final_ans[15];
const int modo=1000000007;
int c(int n,int m)
{
    long long i;
    long long p=1;
    for (i=1;i<=n;i++)
    {
        p*=i;
    }
    for (i=1;i<=m;i++)
    {
        p/=i;
    }
    for (i=1;i<=n-m;i++)
    {
        p/=i;
    }
    return p;
}
const int m=100000000;
int main()
{
    memset(ans,0,sizeof(ans));
    int i,j;
    ans[1]=0;
    for (i=2;i<=m;i++)
    {
        if (ans[i]==-1) continue;
        if (i<=10000)
        {
            for (j=i*i;j<=m;j+=i)
            {
                ans[j]=-1;
                last_p[j]=i;
            }
        }
    }
    for (i=2;i<=m;i++)
    {
        if (ans[i]==0)
        {
            ans[i]=1;
        }
        else
        {
            if ((i/last_p[i])%last_p[i]==0)
            {
                ans[i]=-10000;
            }
            else
            {
                ans[i]=ans[i/last_p[i]]+1;
            }
        }
    }
    for (i=1;i<=m;i++)
    {
        if (ans[i]<0) continue;
        //cout<<ans[i]<<" ";
        final_ans[ans[i]]+=(n/i/i);
    }
    //cout<<endl;
    for (i=14;i>=0;i--)
    {
        int j;
        for (j=14;j>i;j--)
        {
            final_ans[i]-=final_ans[j]*c(j,i);
        }
    }
    long long p=1;
    for (i=0;i<=14;i++)
    {
        cout<<final_ans[i]<<endl;
        if (final_ans[i]!=0)
        {
            p=(long long)p*(final_ans[i]%modo)%modo;
        }
    }
    cout<<endl<<endl<<p<<endl;
    system("pause");
    return 0;
}

而後633是一個近似的過程io

因爲要咱們求7的,咱們就求7+的ast

顯然咱們已經不知足於1016這麼小的範圍,那隻好擴大class

把程序改爲搜索,開始爆搜stream

加個剪枝仍是挺快的搜索

質數能夠少選一些,後面的不要了

跑出最終結果須要一段時間,還要耐心等待...

反正最後跑出來結果之後咱們還能夠再稍微加一加試一試對不對,咱們精度4位就夠,題目也只要求5位

#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<time.h>
#include<math.h>
#include<memory>
#include<vector>
#include<bitset>
#include<fstream>
#include<stdio.h>
#include<utility>
#include<sstream>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const long long m=1000000000000ll;
int c(int n,int m)
{
    long long i;
    long long p=1;
    for (i=1;i<=n;i++)
    {
        p*=i;
    }
    for (i=1;i<=m;i++)
    {
        p/=i;
    }
    for (i=1;i<=n-m;i++)
    {
        p/=i;
    }
    return p;
}
bool prime[4000005];
int p[500005];
int cnt=0;
double ans[15];
double calc(long long x,int y,int c=0)
{
    if (x>m)
    {
        return 0;
    }
    if (y==0)
    {
        return (long long)((double)m*m/x/x);
    }
    int i;
    double sum=0;
    for (i=c;i<cnt;i++)
    {
        double k=calc(x*p[i],y-1,i+1);
        if (k==0)
        {
            return sum;
        }
        sum+=k;
    }
    return sum;
}
int main()
{
    memset(prime,true,sizeof(prime));
    int i,j;
    ans[1]=0;
    for (i=2;i<=10000;i++)
    {
        if (prime[i])
        {
            for (j=i*i;j<=4000000;j+=i)
            {
                prime[j]=false;
            }
        }
    }
    for (i=2;i<=4000000;i++)
    {
        if (prime[i])
        {
            p[cnt++]=i;
        }
    }
    ans[10]=max(0.0,calc(1,10));
    ans[9]=max(0.0,calc(1,9));
    ans[8]=calc(1,8);
    ans[7]=calc(1,7);
    ans[9]-=c(10,9)*ans[10];
    ans[8]-=c(10,8)*ans[10];
    ans[7]-=c(10,7)*ans[10];
    ans[8]-=c(9,8)*ans[9];
    ans[7]-=c(9,7)*ans[9];
    ans[7]-=c(8,7)*ans[8];
    cout<<ans[7]<<endl;
    system("pause");
    return 0;
}
相關文章
相關標籤/搜索