o(╯□╰)odp

o(╯□╰)o不知道怎么学好了,偷偷刷喵呜的博客,踩着前辈的脚印前进好了

2044 [没考虑long long 问题 wa了一次%>_<%]

#include<iostream>
#include<cstring>
using namespace std;

long long dp[52];
int main()
{
      int n,a,b;
      while(cin>>n)
      {
            while(n--)
            {
                  memset(dp,0,sizeof(dp));
                  cin>>a>>b;
                  dp[a]=1;
                  dp[a+1]=1;
                  for(int i=a+2;i<=b;i++)
                  {
                        dp[i]=dp[i-1]+dp[i-2];
                  }
                  cout<<dp[b]<<endl;

            }
      }
      return 0;
}
2045

#include<iostream>
#include<cstring>
using namespace std;

long long dp[52];

int main()
{
      int n;
      memset(dp,0,sizeof(dp));
      dp[1]=3;
      dp[2]=dp[3]=6;
      for(int i=4;i<=50;i++)
            dp[i]=dp[i-1]+dp[i-2]*2;
      while(cin>>n)
      {
            cout<<dp[n]<<endl;
      }
      return 0;
}
2046[貌似假期的时候做过这种题啊,当时怎么想都想不明白,o(╯□╰)o]

#include<iostream>
#include<cstring>
using namespace std;

long long dp[52];

int main()
{
      int n;
      memset(dp,0,sizeof(dp));
      dp[1]=1;
      dp[2]=2;
      for(int i=3;i<=50;i++)
            dp[i]=dp[i-1]+dp[i-2];
      while(cin>>n)
      {
            cout<<dp[n]<<endl;
      }
      return 0;
}

2047[看了喵呜的博客说,2047是可以由2046改编的,前一个也乘2就可以了]

#include<iostream>
#include<cstring>
using namespace std;

long long dp[42];

int main()
{
      int n;
      memset(dp,0,sizeof(dp));
      dp[1]=3;
      dp[2]=8;
      for(int i=3;i<40;i++)
            dp[i]=(dp[i-1]+dp[i-2])*2;
      while(cin>>n)
      {
            cout<<dp[n]<<endl;
      }
      return 0;
}
2048[错排公式,写的时候在double和llf这里没注意,wa了一次]

当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用M(n)表示,那么M(n-1)就表示n-1个编号元素放在n-1个编号位置,各不对应的方法数,其它类推.
第一步,把第n个元素放在一个位置,比如位置k,一共有n-1种方法;
第二步,放编号为k的元素,这时有两种情况⑴把它放到位置n,那么,对于剩下的n-1个元素,由于第k个元素放到了位置n,剩下n-2个元素就有M(n-2)种方法;⑵第k个元素不把它放到位置n,这时,对于这n-1个元素,有M(n-1)种方法;
综上得到
M(n)=(n-1)[M(n-2)+M(n-1)]
特殊地,M⑴=0,M⑵=1
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;

long long dp[21];

int main()
{
      int n,a;
      long long sum;
      dp[1]=0;
      dp[2]=1;
      for(int i=3;i<21;i++)
      dp[i]=(i-1)*(dp[i-1]+dp[i-2]);

        cin>>n;
            while(n--)
            {

                  cin>>a;
                  sum=1;
                  for(int i=1;i<=a;i++)
                        sum*=i;
                   double   ans=dp[a]*100.0/sum;
                  printf("%.2llf%%\n",ans);



            }
      return 0;
}

2049[这题有点小bt]
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;

long long dp[21],sum[21];

int main()
{
      int n,m,t;
      dp[1]=0;
      dp[2]=1;
      for(int i=3;i<21;i++)
      dp[i]=(i-1)*(dp[i-1]+dp[i-2]);
      sum[0]=sum[1]=1;
      for(int i=2;i<=20;i++)
            sum[i]=i*sum[i-1];

        cin>>t;
            while(t--)
            {

                  cin>>n>>m;
              cout<<sum[n]/sum[m]/sum[n-m]*dp[m]<<endl;
              
            }
      return 0;
}

2050[貌似具体数学里有这个。。。]
#include<iostream>
using namespace std;

long long d;

int main()
{
      int t,n;
      cin>>t;
      while(t--)
      {
            cin>>n;
            d=n*(2*n-1)+1;
            cout<<d<<endl;
      }
      return 0;
}

终于刷完了(⊙o⊙)…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值