【平安夜的胡策】训练12.24(复数预处理+矩阵快速幂+dp)
来源:互联网 发布:淘宝win10激活码来源 编辑:程序博客网 时间:2024/04/28 13:28
这次比赛真是一言难尽,看来必须继续努力。
这次比赛所有的“暴力”分就是170。
T1
题解:
喵喵喵在考场上看到这个题就mengbier了
首先你需要知道复数以及相关的运算法则
我们手玩一通r的1~4次方,就可以发现r中总是含有
格式和ta要的
那么我们就可以预处理出
我们预处理可不能一个一个手玩啊,可以参考复数的运算法则
然后暴力搜索就好了
代码:
60pts
#include <cstdio>#include <cstring>#include <iostream>using namespace std;double a[25],b[25],x,y;bool fff=0;int c[25];void dfs(int t,double aa,double bb){ if (aa==x && bb==y){fff=1; return;} if (t>23) return; for (int i=0;i<=1 && !fff;i++) if (i==0) dfs(t+1,aa,bb); else { c[t]=i;dfs(t+1,aa+a[t],bb+b[t]); if (!fff) c[t]=0; }}int main(){ freopen("verlauf.in","r",stdin); freopen("verlauf.out","w",stdout); scanf("%lf%lf",&x,&y); a[0]=1; b[0]=0; a[1]=-0.5; b[1]=0.5; for (int i=2;i<=23;i++) { a[i]=a[i-1]*(-0.5)-7*b[i-1]*0.5; b[i]=a[i-1]*0.5+b[i-1]*(-0.5); } dfs(0,0,0); for (int i=0;i<=23;i++) if (c[i]) printf("%d ",i);}
T2
题解:
我们先写一个dfs找找规律?
1 3 3
2 3 9
3 3 21
4 3 51
5 3 123
6 3 297
7 3 717
…
看上去毫无规律啊
但是我们有充足的想象!
21-9-9=3
51-21-21=9
123-51-51=21
297-123-123=51
717-297-297=123
…
诶他们都是减上2倍的上一个答案就是上上一个答案啊
那这一个答案岂不就是上上一个答案+2*上一个答案?
嗯我们看看4
代码:
T3
题解:
考场上不知道怎么脑抽,写的dfs都不知道写一个“科学”的暴力
f[i][j]表示第i位上选j这个数数组的个数
注意预处理的时候第一位取谁都是可以的,都设为1
代码:
#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int mod=1e9+7;int n,m,f[1005][1005],a[1005];int gcd(int a,int b){if (!b) return a;else return gcd(b,a%b);}int main(){ freopen("geburtstag.in","r",stdin); freopen("geburtstag.out","w",stdout); scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) scanf("%d",&a[i]); for (int i=1;i<=a[1];i++) f[1][i]=1; for (int i=1;i<=n;i++) for (int j=1;j<=a[i];j++) for (int k=1;k<=a[i-1];k++) if (gcd(j,k)<=m) f[i][j]=(f[i][j]+f[i-1][k])%mod; int ans=0; for (int i=1;i<=a[n];i++) ans=(ans+f[n][i])%mod; printf("%d",ans);}
阅读全文