第一题 方程整数解
-30 我做完题目去网上对答案 好多人都没有考虑到整数包括负数
第二题
2017-08-05
第三题
奇妙的数字
小明发现了一个奇妙的数字。它的平方和立方正好把0~9的10个数字每个用且只用了一次。
你能猜出这个数字是多少吗?
请填写该数字,不要填写任何多余的内容。
69
第四题
九数组分数
1,2,3...9 这九个数字组成一个分数,其值恰好为1/3,如何组法?
下面的程序实现了该功能,请填写划线部分缺失的代码。
#include <stdio.h>
void test(int x[])
{
int a = x[0]*1000 + x[1]*100 + x[2]*10 + x[3];
int b = x[4]*10000 + x[5]*1000 + x[6]*100 + x[7]*10 + x[8];
if(a*3==b) printf("%d / %d\n", a, b);
}
void f(int x[], int k)
{
int i,t;
if(k>=9){
test(x);
return;
}
for(i=k; i<9; i++){
{t=x[k]; x[k]=x[i]; x[i]=t;}
f(x,k+1);
t=x[k]; x[k]=x[i]; x[i]=t; // 填空处
}
}
int main()
{
int x[] = {1,2,3,4,5,6,7,8,9};
f(x,0);
return 0;
}
注意:只填写缺少的内容,不要书写任何题面已有代码或说明性文字。
第五题
九数组分数
1,2,3...9 这九个数字组成一个分数,其值恰好为1/3,如何组法?
下面的程序实现了该功能,请填写划线部分缺失的代码。
#include <stdio.h>
void test(int x[])
{
int a = x[0]*1000 + x[1]*100 + x[2]*10 + x[3];
int b = x[4]*10000 + x[5]*1000 + x[6]*100 + x[7]*10 + x[8];
if(a*3==b) printf("%d / %d\n", a, b);
}
void f(int x[], int k)
{
int i,t;
if(k>=9){
test(x);
return;
}
for(i=k; i<9; i++){
{t=x[k]; x[k]=x[i]; x[i]=t;}
f(x,k+1);
t=x[k]; x[k]=x[i]; x[i]=t; // 填空处
}
}
int main()
{
int x[] = {1,2,3,4,5,6,7,8,9};
f(x,0);
return 0;
}
注意:只填写缺少的内容,不要书写任何题面已有代码或说明性文字。
第六题
牌型种数
小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
请填写该整数,不要填写任何多余的内容或说明文字。
3598180
#include<iostream>
using namespace std;
int cnt=0;
void dfs(int type,int sum)//牌的种类, 取牌总数
{
if(sum==13)
{
cnt++;
return;
}
if(type==14 || sum>13)
return;
for(int i=0;i<5;i++)
{
dfs(type+1,sum+i);
}
return;
}
int main()
{
dfs(1,0);
cout<<cnt<<endl;
return 0;
}
这是第一次写的错误的,不知道错在哪里了,代码放出来希望大家能帮我看下哪里错啦。
/*
这道题我的做法一开始是错的 但是我不知道错在哪里
我的思路是每种牌只能取0,1,2,3,4张
所以设取了一张牌的有A个,取了两张牌的有B个,取了三张牌的有C个,取了四张牌的有D个
则A+2B+3C+4D=13时,
用排列组合去取各种可能。
比如A=0,B=2,C=3,D=0的时候,就是13种牌取两种,每种取两张牌,取三种牌每种取三张。
但是得出结论是3597966 不知道为什么不对
*/
#include<iostream>
using namespace std;
int combine(int a,int b)
{//排列组合 c上a下b
int cnt1=1;
int cnt2=1;
for(int i=0;i<a;i++)
{
cnt1*=(b-i);
cnt2*=(i+1);
}
return cnt1/cnt2;
}
int main()
{
int a,b,c,d;
int cnt=0;
for(a=0;a<=13;a++)
{
for(b=0;a+2*b<=13&&b<=6;b++)
{
for(c=0;a+2*b+3*c<=13 && c<=4;c++)
{
for(d=0;a+2*b+3*c+4*d<=13 && d<=3;d++)
{
if(a+2*b+3*c+4*d==13)
{
cnt+=combine(a,13)*combine(b,13-a)*combine(c,13-a-b)*combine(d,13-a-b-c);
}
}
}
}
}
cout<<cnt<<endl;
return 0;
}
第七题
手链样式
小明有3颗红珊瑚,4颗白珊瑚,5颗黄玛瑙。
他想用它们串成一圈作为手链,送给女朋友。
现在小明想知道:如果考虑手链可以随意转动或翻转,一共可以有多少不同的组合样式呢?
请你提交该整数。不要填写任何多余的内容或说明性的文字。
仿佛回到了学离散数学的时候~
这部分的代码要写一下
1170
第八题
饮料换购
乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去(但不允许暂借或赊账)。
请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的n瓶饮料,最后他一共能喝到多少瓶饮料。
输入:一个整数n,表示开始购买的饮料数量(0<n<10000)
输出:一个整数,表示实际得到的饮料数
例如:
用户输入:
100
程序应该输出:
149
用户输入:
101
程序应该输出:
151
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int cnt=0;
cnt=n;
while(n/3!=0)
{
int a=n/3;
cnt+=a;
n=n-a*3+a;
}
cout<<cnt<<endl;
}
第九题
垒骰子
赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体。
经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥!
我们先来规范一下骰子:1 的对面是 4,2 的对面是 5,3 的对面是 6。
假设有 m 组互斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来。
atm想计算一下有多少种不同的可能的垒骰子方式。
两种垒骰子方式相同,当且仅当这两种方式中对应高度的骰子的对应数字的朝向都相同。
由于方案数可能过多,请输出模 10^9 + 7 的结果。
不要小看了 atm 的骰子数量哦~
「输入格式」
第一行两个整数 n m
n表示骰子数目
接下来 m 行,每行两个整数 a b ,表示 a 和 b 数字不能紧贴在一起。
「输出格式」
一行一个数,表示答案模 10^9 + 7 的结果。
「样例输入」
2 1
1 2
「样例输出」
544
「数据范围」
对于 30% 的数据:n <= 5
对于 60% 的数据:n <= 100
对于 100% 的数据:0 < n <= 10^9, m <= 36
#include<iostream>
using namespace std;
bool face[7][7]={false};//true表示不能两个面接触
int opposite[7]={0,4,5,6,1,2,3};//对立面
long long int cnt=0;
long long int themod=1000000007;
long long int dfs(int n,int num)
{
long long int cnthelp=0;
if(n==0)
return 1;
if(num==-1)//放置第一个骰子
{
for(int i=1;i<7;i++)
{
cnt=(cnt+4*dfs(n-1,i)%themod)%themod;
}
}
else
{
for(int i=1;i<7;i++)
{
if(face[opposite[num]][i]==false)
{//确定上下面之后 前后左右有四种朝向
cnthelp=(cnthelp+4*dfs(n-1,i)%themod)%themod;
}
}
}
return cnthelp;
}
int main()
{
int n,m;
cin>>n>>m;
int a,b;
for(int i=0;i<m;i++)
{
cin>>a>>b;
face[a][b]=true;
face[b][a]=true;
}
dfs(n,-1);
cout<<cnt<<endl;
return 0;
}
第十题
emmm我觉得很麻烦,有点难。