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; }
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 }
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; } }