T1Soomth

大力打表,只拿了80哭

开15个队列,每次取15个队列里最小的,乘上相应的质数,放到较大的编号的队列里面

操作1e7次就好了

#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
inline int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-') f=-1; ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;
}
const int maxn=1e7+5;
int prime[16]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47};
int b,k;
const int mod=1e18;
int dp[maxn],minn=1e18,from;
queue<int >q[16];
signed main()
{
    b=read();k=read();
    dp[1]=1;dp[2]=2;
    for(int i=1;i<=15;i++)
    {
        q[i].push(prime[i]);
    }
    minn=1;
    for(int i=1;i<k;i++)
    {
        minn=1e18;
        for(int j=1;j<=b;j++)
        {
            if(!q[j].empty());
            if(q[j].front()<minn)
            { 
                minn=min(q[j].front(),minn);
                from=j;
            }
        }
        q[from].pop();
        for(int j=from;j<=b;j++)
        {
            if(from<j)
            {
                q[j].push(minn*prime[j]);
            }
            else 
            {
                q[from].push(minn*prime[j]);
            }
        }
    }
    cout<<minn<<endl;
}
T1

T2six

神仙dp,让我想一年都想不出来

状态:当前序列中出现的质因子集合 ,当前序列中出现在两个不同的数中的质因子对集合

转移需要一个较复杂的判断,应该可以预处理。状态数看似很多,可以计算有效状态数的

上限在50000,可以用 map 或 vector 存储,或者使用记忆化搜索。

  1 #include<bits/stdc++.h>
  2 #define int long long
  3 using namespace std;
  4 inline int read()
  5 {
  6     int x=0,f=1; char ch=getchar();
  7     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  8     while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  9     return x*f;
 10 }
 11 const int mod=1e9+7;
 12 int dp[7][7],lazy[1<<21|1];
 13 int n,sum[1<<6|1],prime[100005],t[7],a[100005],cnt[1<<6|1];
 14 int jyf[100005];
 15 struct node{int x,y;};
 16 bool operator < (node A,node B){
 17     return (A.x==B.x)?A.y<B.y:A.x<B.x;
 18 }
 19 map <node,int> mp;
 20 inline void cz1()
 21 {
 22     register int lin=n;
 23     for(register int i=2;i<=sqrt(n);++i)
 24     if(lin%i==0)
 25     {
 26         prime[++prime[0]]=i;
 27         t[prime[0]]=1<<(prime[0]-1);
 28         while(lin%i==0)lin/=i;
 29     }
 30     if(lin!=1)
 31     {
 32         prime[++prime[0]]=lin;
 33         t[prime[0]]=1<<(prime[0]-1);
 34     }
 35     return ;
 36 }
 37 inline void cz2()
 38 {
 39     for(register int i=1;i<=sqrt(n);++i)
 40       if(n%i==0)
 41       {
 42              if(i!=1)jyf[++jyf[0]]=i;
 43             if(n/i!=i)jyf[++jyf[0]]=n/i;
 44       }
 45       return ;
 46 }
 47 inline void cz3()
 48 {
 49     for(register int i=1,res;i<=jyf[0];++i)
 50       {
 51             res=0;
 52             for(register int j=1;j<=prime[0];++j)
 53             if(jyf[i]%prime[j]==0)res|=t[j];
 54             cnt[res]++;
 55       }
 56       return ;
 57 }
 58 inline void init()
 59 {
 60     cz1();cz2();cz3();
 61     dp[1][1]=1<<0;dp[2][2]=1<<1;dp[3][3]=1<<2;
 62         dp[4][4]=1<<3;dp[5][5]=1<<4;dp[6][6]=1<<5;
 63         dp[1][2]=dp[2][1]=1<<6;dp[1][3]=dp[3][1]=1<<7;
 64         dp[1][4]=dp[4][1]=1<<8;dp[1][5]=dp[5][1]=1<<9;
 65         dp[1][6]=dp[6][1]=1<<10;dp[2][3]=dp[3][2]=1<<11;
 66         dp[2][4]=dp[4][2]=1<<12;dp[2][5]=dp[5][2]=1<<13;
 67         dp[2][6]=dp[6][2]=1<<14;dp[3][4]=dp[4][3]=1<<15;
 68         dp[3][5]=dp[5][3]=1<<16;dp[3][6]=dp[6][3]=1<<17;
 69         dp[4][5]=dp[5][4]=1<<18;dp[4][6]=dp[6][4]=1<<19;
 70         dp[5][6]=dp[6][5]=1<<20;
 71         vector <int> v;
 72       for(register int i=1;i<=(1<<prime[0])-1;++i)
 73       {
 74             v.clear();register int res=i;
 75             for(register int j=1;j<=prime[0];++j)
 76             if(res&t[j])v.push_back(j);
 77             for(register int j=0;j<v.size();++j)
 78             for(register int k=j;k<v.size();++k)
 79             lazy[i]|=dp[v[j]][v[k]];
 80       }
 81 }
 82 inline int dfs(int x,int y)
 83 {
 84       node lode=(node){x,y};
 85       if(mp[lode]) return mp[lode]%mod;
 86       for(register int i=1;i<=(1<<prime[0])-1;++i)
 87       {
 88             if(lazy[i]&y)continue;
 89             register int lin=y;
 90             for(register int j=1;j<=prime[0];++j)
 91             {
 92                   if(!(i&t[j]))continue;
 93                   for(register int k=1;k<=prime[0];++k)
 94                   {
 95                         if(!(x&t[k]))continue;
 96                         lin|=dp[j][k];
 97                   }
 98             }
 99             mp[lode]=(mp[lode]+cnt[i]*(dfs(x|i,lin)%mod+1))%mod;
100       }
101       return mp[lode]%mod;
102 }
103 signed main()
104 {
105     n=read();init();
106     printf("%lld\n",dfs(0,0));
107 }
T2

T3Walker

dio斯消元+随机化,随机选取50组数据,只要不是非洲血统应该都能出答案

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;
}
const int maxn=1e5+5;
const double djj=0.001;
int n,m;
double x[maxn],y[maxn],xx[maxn],yy[maxn];
double a[10][10];
void dios()
{
    int r=1;
    for(int c=1;c<=n;c++)
    {
        int t=r;
        for(int i=r+1;i<=n;i++) if(fabs(a[i][c])>fabs(a[t][c]))
        t=i; if(fabs(a[t][c])<djj) continue;
        if(t!=r) for(int i=c;i<=n+1;i++)
        swap(a[t][i],a[r][i]);
        for(int i=n+1;i>=c;i--) a[r][i]/=a[r][c];
        for(int i=r+1;i<=n;i++) if(fabs(a[i][c])>djj)
        for(int j=n+1;j>=c;j--) a[i][j]-=a[r][j]*a[i][c];
        r++;
    }
    for(int i=n;i>0;i--) for(int j=i+1;j<=n;j++)
    a[i][n+1]-=a[j][n+1]*a[i][j];
}
bool check(int fi,int sc)
{
    a[1][1]=x[fi]; a[1][2]=-y[fi]; a[1][3]=1; a[1][4]=0; a[1][5]=xx[fi];
    a[2][1]=y[fi]; a[2][2]= x[fi]; a[2][3]=0; a[2][4]=1; a[2][5]=yy[fi];
    a[3][1]=x[sc]; a[3][2]=-y[sc]; a[3][3]=1; a[3][4]=0; a[3][5]=xx[sc];
    a[4][1]=y[sc]; a[4][2]= x[sc]; a[4][3]=0; a[4][4]=1; a[4][5]=yy[sc];
    dios();
    double dlx=a[3][5],dly=a[4][5],aa=a[1][5],bb=a[2][5];
    double scale=sqrt(aa*aa+bb*bb);
    int cnt=0;double seita=acos(aa/scale);
    if(bb<0) seita=-seita;
    aa/=scale,bb/=scale;
    for(int i=1;i<=m;i++)
    {
        double x1,y1;
        x1=x[i]*aa-y[i]*bb;
        y1=y[i]*aa+x[i]*bb;
        x1*=scale,y1*=scale;
        x1+=dlx,y1+=dly;
        if(fabs(x1-xx[i])<=djj&&fabs(yy[i]-y1)<=djj)
        cnt++;
    }
    if(cnt>=(m+1)/2)
    {
        printf("%.8lf\n%.8lf\n%.8lf %.8lf",seita,scale,dlx,dly);
        return 1;
    }
    return 0;
}
int main()
{    
    srand(time(0));
    //freopen("a.in","r",stdin);
    n=4; m=read(); for(int i=1;i<=m;i++)
    scanf("%lf%lf%lf%lf",&x[i],&y[i],&xx[i],&yy[i]);    
    int tttttttttttt=0;
    while(1)
    {
        int a=rand()%m+1,b=rand()%m+1;
        ///cout<<a<<" "<<b<<endl;
        if(check(a,b))
        break;
    }
}
T3

 

posted on 2021-08-08 20:28  JYFHYX  阅读(31)  评论(0编辑  收藏  举报