这次比赛真是一言难尽,看来必须继续努力。
这次比赛所有的“暴力”分就是170。
T1
题解:
喵喵喵在考场上看到这个题就mengbier了
首先你需要知道复数以及相关的运算法则
我们手玩一通r的1~4次方,就可以发现r中总是含有
7√i
,还有一个常数项
格式和ta要的
x+y7√i
一样呀
那么我们就可以预处理出
r223
以内的
a+b7√i
中的a和b,为什么2^23呢?因为更大的1s就跑不出来了
我们预处理可不能一个一个手玩啊,可以参考复数的运算法则
z1=a+bi,z2=c+di
z1∗z2=ac+adi+bci+bdi2=(ac−bd)+(ad+bc)i
然后暴力搜索就好了
代码:
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
70pts
T3
题解:
考场上不知道怎么脑抽,写的dfs都不知道写一个“科学”的暴力
f[i][j]表示第i位上选j这个数数组的个数
注意预处理的时候第一位取谁都是可以的,都设为1
代码:
40pts
#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);
}