今天,我很开心,because过了今天福州之行就过了一半了,开个玩笑。(秒严肃)今天我们学了数论(我天,表示我一脸懵逼),好吧,我觉得它有点抽象,感觉和数学没什么区别,举几个例子:
NO.1
n= a1 a2 a3...an
p1 p2 p3...pn
m= b1 b2 b3...bn
p1 p2 p3...pn
(最大公约数)gcd(m,n)= min(a1,b1) min(a2,b2) ...min(an,bn)(中间省略乘号)
p1 p2 ...pn
(最小公倍数)lcm(m,n) max(a1,b1) max(a2,b2)...max(an,bn)(中间省略乘号)
p1 p2 pn
NO.2
若a%m=1且b%m=1则我们说a≡b(mod m)
a1≡a2;
b1≡b2;
a1+(-)b1≡a2+(-)b2;
a1b1≡a2b2;
今天考题如下:
NO.1
数字游戏
题目大意:给定一个正整数n,求最大的整数x,使得n<x,且f(x) =f(n)−1,其中f(n)为n的各个位上数码之和,比如f(1234) =1 + 2 + 3 + 4 = 10。
分析:经过多次实验可知,这题只需将n的最低非零位-1即可看,但是,如果是10的幂,则输出0,具体可以用数组来实现。代码如下:
#include <bits/stdc++.h>
using namespace std;
string n;
int l,sum=0;
bool f;//判断是否找到并减1
int main()
{
//freopen("numgame1.in","r",stdin);
//freopen("numgame1.out","w",stdout);
cin>>n;//先读入第一个数
while (n!="END")判断是否是结束的标志
{
f=false;
sum=0;
int k=1;
l=n.size();
for (int i=l-1;i>=0;i--) {
if (n[i]>'0'&&!f) //从高位寻找最后一个非零位
{
n[i]--;//按题意减1
f=true;//标志为找到
}
sum=int(n[i]-48)*k+sum;//转成数字存储
k=k*10;
}
cout<<sum<<endl;
cin>>n;
}
//fclose(stdin);
//fclose(stdout);
return 0;
}
NO.2
石子游戏
题目大意:现在有一堆共n个石子,小a和小b两人轮流从中取石子(小a先取),取到最后一个石子的人获胜。但游戏不可能这么简单,所以有一个限制,
每个人每次只能从中取1个或者质数个石子,显然每次取出的石子个数不能超过当前堆中的石子个数。给定n,判断谁有必胜策略。
分析:可以先通过打表,然后你就会发现,这里的1,2,3都是不可取的,所以我们不妨用模4来分类。接下来,注意到不能取走4的倍数个石子,并且可以取走模4余1,2,3个石子,那么显然石子数是4的倍数时,小b必胜,否则小a必胜。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main()
{
//freopen("stone.in","r",stdin);
//freopen("stone.out","w",stdout);
int n;
cin>>n;
int a;
for (int i=1;i<=n;i++)
{
cin>>a;
if (a%4==0) cout<<"B"<<endl;
else cout<<"A"<<endl;
}
//fclose(stdin);
//fclose(stdout);
return 0;
}
n= a1 a2 a3...an
p1 p2 p3...pn
m= b1 b2 b3...bn
p1 p2 p3...pn
(最大公约数)gcd(m,n)= min(a1,b1) min(a2,b2) ...min(an,bn)(中间省略乘号)
p1 p2 ...pn
(最小公倍数)lcm(m,n) max(a1,b1) max(a2,b2)...max(an,bn)(中间省略乘号)
p1 p2 pn
NO.2
若a%m=1且b%m=1则我们说a≡b(mod m)
a1≡a2;
b1≡b2;
a1+(-)b1≡a2+(-)b2;
a1b1≡a2b2;
今天考题如下:
NO.1
数字游戏
题目大意:给定一个正整数n,求最大的整数x,使得n<x,且f(x) =f(n)−1,其中f(n)为n的各个位上数码之和,比如f(1234) =1 + 2 + 3 + 4 = 10。
分析:经过多次实验可知,这题只需将n的最低非零位-1即可看,但是,如果是10的幂,则输出0,具体可以用数组来实现。代码如下:
#include <bits/stdc++.h>
using namespace std;
string n;
int l,sum=0;
bool f;//判断是否找到并减1
int main()
{
//freopen("numgame1.in","r",stdin);
//freopen("numgame1.out","w",stdout);
cin>>n;//先读入第一个数
while (n!="END")判断是否是结束的标志
{
f=false;
sum=0;
int k=1;
l=n.size();
for (int i=l-1;i>=0;i--) {
if (n[i]>'0'&&!f) //从高位寻找最后一个非零位
{
n[i]--;//按题意减1
f=true;//标志为找到
}
sum=int(n[i]-48)*k+sum;//转成数字存储
k=k*10;
}
cout<<sum<<endl;
cin>>n;
}
//fclose(stdin);
//fclose(stdout);
return 0;
}
NO.2
石子游戏
题目大意:现在有一堆共n个石子,小a和小b两人轮流从中取石子(小a先取),取到最后一个石子的人获胜。但游戏不可能这么简单,所以有一个限制,
每个人每次只能从中取1个或者质数个石子,显然每次取出的石子个数不能超过当前堆中的石子个数。给定n,判断谁有必胜策略。
分析:可以先通过打表,然后你就会发现,这里的1,2,3都是不可取的,所以我们不妨用模4来分类。接下来,注意到不能取走4的倍数个石子,并且可以取走模4余1,2,3个石子,那么显然石子数是4的倍数时,小b必胜,否则小a必胜。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int main()
{
//freopen("stone.in","r",stdin);
//freopen("stone.out","w",stdout);
int n;
cin>>n;
int a;
for (int i=1;i<=n;i++)
{
cin>>a;
if (a%4==0) cout<<"B"<<endl;
else cout<<"A"<<endl;
}
//fclose(stdin);
//fclose(stdout);
return 0;
}