饮料换购
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;
}