一、题目描述:
给你一个长度为
求有多少种
本题中完全平方数的定义:若存在某个整数
答案对
二、解题思路:
其实题意就是说相邻两个数的乘积不能为完全平方数。
首先容易发现性质:若正整数
证明:设
若正整数
那么
因为
所以
注意
所以如果有
于是我们将这
于是我们发现这个题转化为一个
对于一个集合,因为不能集合内的数不能相邻,可以理解成我们有
枚举上一步剩余的空,枚举这一步填上的空,枚举这一步新产生的空,转移就可以了。
不过这个代码里面的
其实这一步是要求有
乍一看,每个数都有
其实这样漏掉了多个数在同一位置上的不同排列方案。
但是我肯定不可能枚举每个位置上的数的个数来求排列,只好一开始就求出排列。
于是问题变成了顺序在
这个问题可以递归求解,记忆化搜索做到时间复杂度
于是这道鬼畜的
三、完整代码:
1 #include<bits/stdc++.h> 2 #define N 1010 3 #define ll long long 4 #define M 1000000007 5 #define rep(i,l,r) for(ll i=l;i<=r;i++) 6 #define per(i,r,l) for(ll i=r;i>=l;i--) 7 using namespace std; 8 ll n,a[N],fac[N],inv[N],f[N][N]; 9 ll cnt,bel[N],sz[N],sum[N],dp[N][N],vis[N][N]; 10 ll C(ll x,ll y){ 11 return fac[x]*inv[y]%M*inv[x-y]%M; 12 } 13 ll ksm(ll base,ll q){ 14 ll res=1;while(q){ 15 if(q&1) res*=base,res%=M; 16 base*=base;base%=M;q>>=1; 17 } return res; 18 } 19 ll dfs(ll tot,ll cc){ 20 if(cc==0) return 1; 21 if(vis[tot][cc]) return dp[tot][cc]; vis[tot][cc]=1; 22 rep(i,1,tot) (dp[tot][cc]+=dfs(tot-i+1,cc-1))%=M; 23 return dp[tot][cc]; 24 } 25 int main(){ 26 ios::sync_with_stdio(false); 27 cin.tie(0);cout.tie(0); 28 cin>>n; rep(i,1,n) cin>>a[i]; 29 rep(i,1,n) if(!a[i]){ 30 cout<<(n==1)<<'\n'; 31 return 0; 32 } 33 rep(i,1,n){ 34 bool flag=0; rep(j,1,cnt){ 35 ll val=a[i]*bel[j],sval=sqrt(val); 36 if(sval*sval==val){flag=1;sz[j]++;break;} 37 } if(!flag) bel[++cnt]=a[i],sz[cnt]=1; 38 } 39 fac[0]=1; rep(i,1,n<<1) fac[i]=fac[i-1]*i%M; 40 rep(i,0,n<<1) inv[i]=ksm(fac[i],M-2); 41 f[0][0]=1; rep(i,1,cnt) sum[i]=sum[i-1]+sz[i]; 42 rep(i,1,cnt) rep(j,0,max(sum[i-1]-1,0ll)) 43 rep(k,0,min(sz[i],j)) rep(l,0,sz[i]-k){ 44 ll t1=C(sz[i],k)*fac[k]%M*C(j,k)%M; 45 ll t2=C(sz[i]-k,l)*fac[l]%M*dfs(sz[i]-l,l)%M; 46 ll res=sz[i]-k-l; 47 ll t3=C(sum[i-1]+1-j,res)*fac[res]%M; 48 (f[i][j-k+l]+=f[i-1][j]*t1%M*t2%M*t3%M)%=M; 49 } 50 cout<<f[cnt][0]<<'\n'; 51 return 0; 52 }
四、写题心得:
今天一上午都用来想这个题了,好在绝杀过大样例。
希望不要把我的
自己想出来这样的题真的很有成就感,所以来写题解了。收获如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探