2015蓝桥杯整理

饮料换购

1.数学思维

#include<iostream>
using namespace std;
int main(){
 int n;
 cin>>n;
 int ans=0;
 while(n>=3){
  n-=2;
  ans+=3;
 }
 ans+=n;
 cout<<ans<<endl;
 return 0;
}

牌型总数

小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
请填写该整数,不要填写任何多余的内容或说明文字。
1.转换思维
2.每种牌只有0,1,2,3,4这几总选择

#include<iostream>
using namespace std;
int ans;
void f(int  k,int cnt){//k是牌类型,cnt是手上牌的数
 if(cnt>13||k>13) return;
 if(k==13&&cnt==13){
  ans++;
  return;
 }
 for(int i=0;i<5;i++){
  f(k+1,cnt+i);
 }
}
int main(){
 f(0,0);
 cout<<ans<<endl;
 return 0;
}

手链样式

小明有3颗红珊瑚,4颗白珊瑚,5颗黄玛瑙。
他想用它们串成一圈作为手链,送给女朋友。
现在小明想知道:如果考虑手链可以随意转动或翻转,一共可以有多少不同的组合样式呢? 请你提交该整数。不要填写任何多余的内容或说明性的文字。

#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
int ans;
int main(){
 string s="aaabbbbccccc";
 vector<string> v1;
 do{//排除重复,对于v1中的每个元素检查
 int i=0;
 for(;i<v1.size();i++){
  if(v1[i].find(s)!=string::npos)
  break;
 } 
 if(i!=v1.size())//不满足条件 
 continue;
 string s2=s+s;
  v1.push_back(s2);//用于判断旋转
  reverse(s2.begin(),s2.end());
  v1.push_back(s2);//将翻转放入vector
  ans++; 
 }while(next_permutation(s.begin(),s.end()));
cout<<ans<<endl;
return 0;
}

奇妙的数字

小明发现了一个奇妙的数字。它的平方和立方正好把0~9的10个数字每个用且只用了一次。
你能猜出这个数字是多少吗?
请填写该数字,不要填写任何多余的内容。


#include<iostream>
#include<sstream>
#include<set>
using namespace std;
void i2s(int num,string &str){
 stringstream ss;
 ss<<num;
 ss>>str;
} 
bool check(string s){
 set<char> ss;//set集合会去掉重复的 
 for(int i=0;i<s.length();i++){
  ss.insert(s[i]);
 }
 return s.size()==10&&ss.size()==10; 
}
int main(){
 for(int i=10;i<100;i++)
 {
  string s1,s2;
  i2s(i*i,s1);
  i2s(i*i*i,s2);
  if(check(s1+s2))
  {
  cout<<i<<endl;
  break;
  }
 }
 return 0;
}

垒骰子

#include<iostream>//递归时间太久 
#define mod 100000007
using namespace std;
int op[7];
bool conflict[7][7];
void init(){//骰子对面 
 op[1]=4;
 op[4]=1;
 op[2]=5;
 op[5]=2;
 op[3]=6;
 op[6]=3;
}
long long int f(int up,int cnt){
 if(cnt==0) return 4;
 long long ans=0;
 for(int upp=1;upp<=6;upp++){
  if(conflict[op[up]][upp]) continue;
  ans+=f(upp,cnt-1);
  ans%=mod;
 }
 return ans;
}
int n,m;
long long ans; 
int main(){
    init();
 cin>>n>>m;
 for(int i=0;i<m;i++){
  int x,y;
  cin>>x>>y;
  conflict[x][y]=true;
  conflict[y][x]=true;
 }
 for(int up=1;up<=6;up++){
  ans+=4*f(up,n-1);
  ans%=mod;
 }
 cout<<ans<<endl;
 return 0;
}

动归

#include<iostream> 
#define mod 100000007
using namespace std;
long long dp[2][7];//表示第i层,限定朝上数字为j的稳定方案数 
int n,m;
bool conflict[7][7];
int op[7];
void init(){
 op[1]=4;
 op[4]=1;
 op[2]=5;
 op[5]=2;
 op[3]=6;
 op[6]=3;
}
int main(){
 init();
 cin>>n>>m;
 for(int i=0;i<m;i++){
  int x,y;
  cin>>x>>y;
  conflict[x][y]=true;
  conflict[y][x]=true;
 }
 for(int j=1;j<=6;j++)
 dp[0][j]=1;
 int cur=0;
 for(int level=2;level<=n;level++){//迭代层数 
  cur=1-cur;
  for(int j=1;j<=6;j++){
   dp[cur][j]=0;
   for(int i=1;i<=6;i++){
    if(conflict[op[j]][i]) continue;
    dp[cur][j]=(dp[cur][j]+dp[1-cur][i])%mod;
   }
  }
 }
 long long sum=0;
 for(int k=1;k<=6;k++)
 sum=(sum+dp[cur][k])%mod;
 //快速幂,求4的n次方
 long long ans=1;
 long long tmp=4;
 long long p=n;
 while(p!=0){
  if(p&1==1) ans=(ans*tmp)%mod;
  tmp=(tmp*tmp)%mod;
  p>>=1;
 }
 cout<<(sum*ans)%mod; 
 return 0;
}
#include<iostream>//矩阵法求解· 
using namespace std;
#define mod 100000007
typedef long long ll;
int n,m;
int op[7];
void init(){
 op[1]=4;
 op[4]=1;
 op[2]=5;
 op[5]=2;
 op[3]=6;
 op[6]=3;
}
struct M{
 ll a[6][6];
 M(){
  for(int i=0;i<6;i++){
   for(int j=0;j<6;j++)
   a[i][j]=1;
  }
 }
};
M mMul(M m1,M m2){
 M ans;
 for(int i=0;i<6;i++){
  for(int j=0;j<6;j++){
   ans.a[i][j]=0;
   for(int k=0;k<6;k++)
   ans.a[i][j]=(ans.a[i][j]+m1.a[i][k]*m2.a[k][j])%mod;
  }
 }
 return ans;
}
M mPow(M m,int k){
 M ans;//单位矩阵
 for(int i=0;i<6;i++)
 for(int j=0;j<6;j++){
  if(i==j) ans.a[i][j]=1;
  else ans.a[i][j]=0;
 }
 while(k!=0){
  if(k&1==1) ans=mMul(ans,m);
  m=mMul(m,m);
  k>>=1;
 }
 return ans; 
}
int main(){
 init();
 cin>>n>>m;
 M cma;//冲突矩阵 
 for(int i=0;i<m;i++){
  int x,y;
  cin>>x>>y;
  cma.a[op[x]-1][y-1]=0; 
     cma.a[op[y]-1][x-1]=0;
 }
 M cmaf=mPow(cma,n-1);//得到冲突矩阵
 ll ans1=0;
  for(int j=0;j<6;j++)
  for(int i=0;i<6;i++)
  ans1=(ans1+cmaf.a[i][j])%mod;
  //快速幂,求4的n次方
 long long ans=1;
 long long tmp=4;
 long long p=n;
 while(p!=0){
  if(p&1==1) ans=(ans*tmp)%mod;
  tmp=(tmp*tmp)%mod;
  p>>=1;}
  cout<<(ans1*ans)%mod;
 return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值