目录
1.小蓝与钥匙
解析:有十四个排错就是要先从28里面选出来14个,之后进行全排错,在网上找了全排错公式的推导
1.假设a放在了b的位置,那么b就有两种放置方法,第一种是b放在a的位置,那么就等于是除了a和b,剩下的n-2位排错,我们记为d(n-2),第二种情况就是b没有放在a的位置,那么就是b放在了其他的位置,也就是说是剩下的n-1位全排错了,我们记为d(n-1)位,这样的话总的来说就是第n位的全排错是d(n)=(n-1)*(d(n-1)+d(n-2)),所以第28位就可以用代码写出来,但是要注意
d(0)=0,d(2)=1
#include <bits/stdc++.h>
using namespace std;
main()
{
int n,i;
long long a[15];
memset(a,0,sizeof(a));
a[2]=1;
for(i=3;i<=14;i++)
{
a[i]=(i-1)*(a[i-1]+a[i-2]);
cout<<a[i]<<endl;
}
cout<<a[14];
}
运行结果是32071101049,在这里要注意a数组的值是可能很大的,要设置成long long类型
接着就是比较简单的取计算c(28,14)了,这个也有一个公式是
c(n,k)=c(n-1,k-1)+c(n-1,k)
#include <bits/stdc++.h>
using namespace std;
f(int n,int k)
{
if(k==0 ||k==n)
return 1;
else return f(n-1,k-1)+f(n-1,k);
}
main()
{
cout<<f(28,14);
}
运行结果是40116600
然后两者乘一下就是答案了,算出来的是1,286,583,532,342,313,400
2.含2天数
这个就是纯粹的遍历了,感觉还是要看看别人才能发现比较好的算法,对我来说比较需要改进的就是年份可以先用数组表示,其次来说闰年公式是if(i%400=0 ||(i%4==0 &&1%100!=0),感觉很奇怪,感觉代码没问题但是跑不出来结果,循环一直停不下来,先放着吧,过几天再来看看
#include <bits/stdc++.h>
using namespace std;
bool f(long long n)
{
while(n>0)
{
if(n%10!=2)
{
n=n/10;
}
else return true;
}
return false;
}
main()
{
long long i,j,k,ans=0;
long long day[]={31,28,31,30,31,30,31,31,30,31,30,31};
for(i=1900;i<=9999;i++)
{
if(i%400==0 ||(i%4==0 && i%100!=0))
{
day[2]=29;
}
else day[2]=28;
for(j=1;j<=12;j++)
{
for(k=1;k<=day[j];k++)
{
if(f(i)|| f(j) ||f(k))
{
cout<<"*0"<<endl;
ans=ans+1;
cout<<ans<<endl;
}
cout<<"-------------"<<endl;
}
}
cout<<"///"<<endl;
}
cout<<ans;
}