任何自然數都能用包含「1、1、4、5、1、4」這 6 個數字的式子表示嗎?
意思是用各種包含 114514 的數字加上 0 和省略後不影響 114514 完整表述的運算符號可以表示出任何自然數。
例如 114 - 5 × 14 = 34。
在表示時可以有 0。
歡迎硬核HOMO答題。
雖然不可以,但是有辦法變成可以,我們先把各位數相加,就算是999999999也才81,可以盡量向100內的數字靠,然後...
0=1+1-4+5+1-4
1=1+1*4*(5-1-4)
2=1+1+4*(5-1-4)
3=1+1*4-5-1+4
4=1+1+4-5-1+4
5=1+1+4-5+1*4
6=1+1+4+5-1-4
7=1+1+4+5-1*4
8=1+1+4+5+1-4
9=1+1*4*(5+1-4)
10=1+1+4*(5+1-4)
11=1+1+45/(1+4)
12=1+1*(45-1)/4
13=1+1-4-5*(1-4)
14=1+1+4+5-1+4
15=1+1+4+5+1*4
16=1+1+4+5+1+4
17=1+1+4*5-1-4
18=1+1+4*5-1*4
19=1+1+4*5+1-4
20=1+1*4-5*(1-4)
21=1+1+4-5*(1-4)
22=1+1+4+(5-1)*4
23=1+1+4*(5+1/4)
24=1+1*4+5+14
25=1+1+4+5+14
26=1+1+4+5*1*4
27=1+1+4*5+1+4
28=1-1+4+(5+1)*4
29=1+1*4+(5+1)*4
30=1+1+4+(5+1)*4
31=1+1+4+5*(1+4)
32=1+1*45-14
33=1+1+45-14
34=1+1+4*(5-1+4)
35=1+1*4*5+14
36=1+1+4*5+14
37=1+1*4*(5+1*4)
38=1+1+4*(5+1*4)
39=1+14+(5+1)*4
40=1+14+5*(1+4)
41=1+1*45-1-4
42=1+1+45-1-4
43=1+1+45-1*4
44=1+1+45+1-4
45=1+1-4+51-4
46=1+1*(4+5)*(1+4)
47=1+1+(4+5)*(1+4)
48=1-1+45-1+4
49=1+1*45-1+4
50=1+1+45-1+4
51=1+1+45+1*4
52=1+1+45+1+4
53=1+1+4+51-4
54=11-4+51-4
55=11*4*5*1/4
56=1*14*5-14
57=1+14*5-14
58=1+(1-4*5)*(1-4)
59=1-1+4+51+4
60=1+1*4+51+4
61=1+1+4+51+4
62=1+1-4*5*(1-4)
63=11*4+5+14
64=1-1+4*(5-1)*4
65=1+1*4*(5-1)*4
66=1+1+4*(5-1)*4
67=1+14*5-1*4
68=1+1-4+5*14
69=1*14+51+4
70=1+14+51+4
71=11-4*5*(1-4)
72=1*(14+5-1)*4
73=1*14*5-1+4
74=1+14*5-1+4
75=1+1*4+5*14
76=1+1+4+5*14
77=1+1*4*(5+14)
78=1+1+4*(5+14)
79=-(1-1*4*5*1*4)
80=1-1+4*5*1*4
81=1+1*4*5*1*4
82=1+1+4*5*1*4
83=-(1-14-5*14)
84=1-1+(4*5+1)*4
85=1+14+5*14
86=1+1+(4*5+1)*4
87=11+4*(5+14)
88=1*14*(5+1)+4
89=1+14*(5+1)+4
90=114-(5+1)*4
91=11+4*5*1*4
92=11*(4+5-1)+4
93=-(11+4*5)*(1-4)
94=114-5*1*4
95=114-5-14
96=1-1+4*(5+1)*4
97=1+1*4*(5+1)*4
98=1+1+4*(5+1)*4
99=11*4+51+4
100=1-1+4*5*(1+4)
100以後還能保持連續的
101 = 1+1*4*5*(1+4)
102 = 1+1+4*5*(1+4)
103 = 11*(4+5*1)+4
104 = 114-5-1-4
105 = 114+5-14
106 = 114-5+1-4
107 = 11+4*(5+1)*4
108 = 114-5-1^4
109 = 114-5*1^4
110 = 114-5+1^4
111 = 11+4*5*(1+4)
112 = 1*14*(5-1+4)
113 = 1+14*(5-1+4)
114 = 11*4+5*14
115 = 114+5-1*4
116 = 114+5+1-4
117 = -(1-14)*(5+1*4)
118 = 114+5-1^4
119 = 114+5*1^4
120 = 114+5+1^4
121.0 = 11*(45-1)/4
122 = 114+5-1+4
123 = 114+5+1*4
124 = 114+5+1+4
125 = 1*(1+4)*5*(1+4)
126 = 1-1+(4+5)*14
127 = 1+14*(5+1*4)
128 = 1+1+(4+5)*14
129 = 114-5*(1-4)
130 = 114+(5-1)*4
131 = 1*145-14
132 = 1+145-14
133 = 114+5+14
134 = 114+5*1*4
135 = 1-1-45*(1-4)
136 = 1-1*45*(1-4)
137 = 1+1-45*(1-4)
138 = 114+(5+1)*4
139 = 114+5*(1+4)
140 = 1*145-1-4
141 = 1+145-1-4
142 = 1+145-1*4
143 = 1+145+1-4
144 = 1*145-1^4
145 = 1+145-1^4
146 = 1+145*1^4
147 = 1+145+1^4
148 = 1*145-1+4
149 = 1+145-1+4
150 = 1+145+1*4
151 = 1+145+1+4
152 = (1+1)*4*(5+14)
153.0 = (1-1/4)*51*4
154 = 11*(4+5+1+4)
155 = (11+4*5)*(1+4)
156 = -(1+(1-4)*51-4)
157 = -(1-1*4)*51+4
158 = 1-(1-4)*51+4
159 = 1*145+14
160 = 1+145+14
161 = 114+51-4
upd:證明有點問題,改了一下,對不起大家,我什麼都會做的(悲
感謝大家的修正!ありがとナス!
完全可以。事實上,就算只用初等的數學記號,我們也完全可以將任何自然數只用這六個數字表示出來。我個人喜歡將它稱作
田所引理(Tadokoros Lemma)任意自然數可只用「1、1、4、5、1、4」及對數、根號、加號、減號表示。
證明 注意到對任意自然數 ,我們有
將其中的三個 分別用 , , 5+1-4,可得
(絕望)
順便,由這個定理,我們可以推得以下的定理:
下北沢第一定理(Shimokitazawas First Theorem, 簡記為dssq定律 (Law of DSSQ)) 一切物質皆為野獸先輩(絕望)
證明 不妨設這個物質有英文名(如果沒有英文名但有名字,則將其名字讀音用拉丁字母表示作為英文名;如果連名字都沒有,就隨便給它起個名(錯亂))那麼
- 每個英文字母都有其唯一的ASCII編號
- 因此該英文名可以用其對應的ASCII編號表示
- 每個ASCII編號都是8位二進位數,二進位數前面可以保留0
- 因此將這些二進位數從頭到尾拼起來,可以得到一個很長的數字
- 將這個數字轉化為十進位數,則每個名字可以唯一對應一個十進位數,我們稱其為這個名字的「特徵值(eigenvalue)」
- 由田所引理,任意一個特徵值可只用「1、1、4、5、1、4」及根號、加號、減號表示
- 結合特徵值的唯一確定性,可知該英文名可以如此表示
- 因此,該物質可以這樣表示
- 於是,該物質可以被數字論證,故它是野獸先輩(絕望)
(噔噔咚)
那麼現在,無論你我,無論花草樹朩,都已經被數字論證為野獸先輩了。這,不正是好時代罵!
好時代,來臨罷!
以上(悲なしいな)
後人解碼相關影片時,才發現114514猜想的奧妙所在:0是多餘的
全自動數字論證機(迫真)
不知道大家有沒有看過《詩云》?既然無法想到某些表示法,那麼就把所有的可能列出來罷!(狂喜)
眾所周知,OIer都事HOMO。本小鬼在以前暑假集訓無聊的時候剛好寫過一個數字論證搜索。幸運的是,只用1,1,4,5,1,4排列+括弧+加減乘除冪階乘所能表示的所有可能也就是一個G左右,篩選之後更是只有1.3M,我們就可以很快地查詢力
由於python我沒怎麼用過,所以還是用的c++寫的,並且事在晚上訂正完考試寫的,所以稍微有些麻煩。
以下是代碼,想看效果的請直接跳到最後,謝謝茄子!
資料庫生成
大體思路就事生成一個排列,然後通過現成的計算器生成答案並且保存。
生成排列
dfs即可。代碼如下,主要用棧模擬
#include&
#include&
#include&
#include&
#include&
#include&
#include&
#include&
#include&
#pragma -g -std=c++11
using namespace std;
int t=0;
const int num[7]={0,1,1,4,5,1,4};
char s[10]={0,+,-,*,/,^,!};
const int mulj[4][7]={{0,0,0,0,0,0,0},{0,1,1,2,1,1,2},{0,0,0,4,2,0,4},{0,0,0,0,0,0,0}};
const int lenj[7]={0,1,1,2,3,1,2};
string ss;
int maxn=0;
int numb=0;
stack&ans;
const int MAX = 30;
const int DONE = 1;
//棧定義
template &
class Stack{
public:
Stack(int MaxStackSize=10);
~Stack() { delete [] stack;}
bool IsEmpty() const {return top==-1;}
bool IsFull() const {return top==MaxTop;}
T Top() const;
Stack& Add(const T x);
Stack& Del(T x);
void MakeEmpty(){top=-1;} //清空棧
void print(){
for(int i; i &< top + 1; i ++){
cout&
Stack&::Stack(int MaxStackSize){
MaxTop=MaxStackSize-1;
stack=new T[MaxStackSize];
top=-1;
}
template&
Stack& Stack&::Add(const T x){
if(IsFull())
{cout&
Stack& Stack&::Del(T x){
if(IsEmpty())
{cout&
T Stack&::Top() const{
return stack[top];
}
//判斷一個字元是否為數字
bool isNum(char c){
if((c &> 0||c == 0)(c &< 9||c == 9))
return true;
else
return false;
}
//刪除字元串中的空格
void deleteBlank(string s){
string::iterator i = s.begin();
while ((i=find(i, s.end(), ))!=s.end())
s.erase(i);
}
//計算器
class Calculator{
public:
Calculator(string s);
~Calculator();
int outPriority(char); //返回棧外優先順序
int inPriority(char); //返回棧內優先順序
bool judgePri(char, char); //判斷優先順序 前一個為棧外符號,後一個為棧內符號 若前大於後返回1,否則返回0
int judgePri(char); //判斷運算符 若是#返回 -1,若是)返回 0,否則返回 1
void dealNum(); //處理數據
int calculate(); //計算
void setString(string const s){
this-&>s = # + s + #;
deleteBlank(this-&>s); //刪除字元串中的空格
}
private:
Stack& *s_sym; //符號棧
Stack& *s_num; //數據棧
string s;
};
Calculator::Calculator(string s){
this-&>s = # + s + #;
deleteBlank(this-&>s);
s_sym = new Stack&(MAX);
s_num = new Stack&(MAX);
}
Calculator::~Calculator(){
delete s_sym;
delete s_num;
}
int Calculator::outPriority(char symble){
switch(symble){
case #:
return 0;
case (:
return 8;
case +:
return 2;
case -:
return 2;
case *:
return 4;
case /:
return 4;
case %:
return 4;
case ^:
return 6;
case ):
return 1;
default:
throw 1;
}
}
int Calculator::inPriority(char symble){
switch(symble){
case #:
return 0;
case (:
return 1;
case +:
return 3;
case -:
return 3;
case *:
return 5;
case /:
return 5;
case %:
return 5;
case ^:
return 7;
case ):
return 8;
default:
throw 1;
}
}
bool Calculator::judgePri(char out, char in){
if(outPriority(out) &> inPriority(in))
return true;
else
return false;
}
int Calculator::judgePri(char symble){
if(symble == #)
return -1;
else if(symble == ))
return 0;
else
return 1;
}
void Calculator::dealNum(){
//將數據棧中的前兩個彈出進行計算,結果放回數據棧,符號棧彈出頂部元素
char _temp = 0;
int dtemp1 = 0;
int dtemp2 = 0;
s_sym-&>Del(_temp);
s_num-&>Del(dtemp1);
s_num-&>Del(dtemp2);
switch(_temp){
case +:
dtemp2 += dtemp1;
break;
case -:
dtemp2 = dtemp2 - dtemp1;
break;
case *:
dtemp2 = dtemp2 * dtemp1;
break;
case /:
if(dtemp1 == 0)
throw 0;
else
dtemp2 = dtemp2 / dtemp1;
break;
case %:
dtemp2 = dtemp2 % dtemp1;
break;
case ^:
dtemp2 = pow(dtemp2,dtemp1);
break;
default:
throw 1;
}
s_num-&>Add(dtemp2);
}
int Calculator::calculate(){
for(int i = 0; i &< s.size(); i ++){ //遍歷字元串
if(isNum(s[i])){
int temp = (int)(s[i]) - 48; //char強制類型轉換為int ascii 碼數值,減 48 轉換為對應整數值
int _temp = 0;
if(i &> 0 isNum(s[i - 1])){
s_num-&>Del(_temp);
temp = _temp * 10 + temp;
}
s_num-&>Add(temp);
}else{
char temp = s[i];
if(s_sym-&>IsEmpty()){
s_sym-&>Add(temp);
}else{
if(judgePri(temp, s_sym-&>Top())){
s_sym-&>Add(temp);
}else if(judgePri(temp) == 1){ //棧外優先順序小於棧內優先順序,且不為 # 和 )
while(!judgePri(temp, s_sym-&>Top())){ //當棧外優先順序比棧內優先順序低時,執行棧內符號運算
dealNum();
}
s_sym-&>Add(temp);
}else if (judgePri(temp) == -1){
while(s_sym-&>Top() != #){
dealNum();
}
int result = s_num-&>Top();
s_sym-&>MakeEmpty();
s_num-&>MakeEmpty();
return result;
}
else if(judgePri(temp) == 0){
while(s_sym-&>Top() != (){
dealNum();
}
s_sym-&>Del(temp);
}
}
}
}
}
char nnans[101];
void exc(){
stack&st;
while(!ans.empty()){
st.push(ans.top());ans.pop();
}
int rs=-1,sta=1,nnn=0;
ss="";
while(!st.empty()){
char now=st.top();ans.push(now);st.pop();
ss+=now;
}
//Calculator c("");
int po=0;int numc=0;
for(int i=0;i&st;
while(!ans.empty()){
//printf("%d
",ans.size());
char sk=ans.top();
st.push(sk);ans.pop();
}
while(!st.empty()){
char now=st.top();ans.push(now);st.pop();
printf("%c",now);
}
putchar(10);
Sleep(500);
}
void dfs(int lev){
if(lev==6){
int tmp=numb;
while(numb--){
ans.push());
}
exc();
numb=tmp;
while(tmp--){
ans.pop();
}
return;
}
lev++;
for(int i=1;i&<=5;i++){
for(int k=1;k&<=lenj[lev];k++) ans.push(mulj[k][lev]+0);
if(lev!=1) ans.push()),numb--;
ans.push(s[i]);
ans.push((),numb++;
//out();
dfs(lev);
for(int k=1;k&<=lenj[lev];k++) ans.pop();
if(lev!=1) ans.pop(),numb++;
ans.pop();
ans.pop();
numb--;
ans.push(char(num[lev]+0));
if(lev!=1) ans.push()),numb--;
ans.push(s[i]);
ans.push((),numb++;
//out();
dfs(lev);
if(lev!=1) ans.pop(),numb++;
numb--;
ans.pop();
ans.pop();
ans.pop();
for(int k=1;k&<=lenj[lev];k++) ans.push(mulj[k][lev]+0);
ans.push(s[i]);
ans.push((),numb++;
//out();
dfs(lev);
for(int k=1;k&<=lenj[lev];k++) ans.pop();
ans.pop();
numb--;
ans.pop();
ans.push(num[lev]+0);
ans.push(s[i]);
ans.push((),numb++;
//out();
dfs(lev);
ans.pop();
ans.pop();
ans.pop();
numb--;
}
return;
}
int main(){
freopen("1.txt","w",stdout);
dfs(0);
return 0;
}
計算答案並輸出資料庫
去重是一個很重要的問題。用map會RE,我只開了個2e7的桶來簡單去重。並且注意到重複一般都聚集在一起(搜索的時候一些相近的生成方案),記錄當前答案之前的幾個答案即可。
#include &
#include &
#include &
#include &
#include &
#include &
#include &
#include &
#include &
#include&
如果想要自己嘗試請依次編譯運行上面三個,不過耗時會有點久,還佔內存(悲)
其實還有更高級的運算可能,有些數字也還沒表示出來,不過大部分都可以,並且我急著要去和朋友曬一發,就沒有寫 (?你改悔罷?)
以下內容純屬抖機靈,正確的證明請參考前面大佬的回答!!!
———哼啊啊啊啊這是分割線啊啊啊———
很容易證明:
我們知道,自然數具有很多有趣的規律,而其中一條極為重要的規律——田所引理——則是證明題主之猜想的重要依據。
我們先來說說歷史
根據田所引理,任何自然數都可以通過簡單線性運算得到1919/810的結果,這一引理揭示了任一自然數均能由1919/810通過簡單線性運算得到,即1919/810為一組自然標準基。
在田所引理的基礎上,偉大的數學家浩二先生提出了著名的浩二變換。浩二先生在一次偶然中,將1919/810與46170分之493183作除,得到57/257,浩二先生敏銳的發現,分母257僅比分子57在百位上多了2,這絕不是一個簡單的發現!浩二先生果斷的將分子分母均加以係數2,得到了一個偉大的結果:114/514。我們很容易發現,自然標準基1919/810通過這一簡單變換,與偉大的114/514建立起直接聯繫。後來,為方便計算,人們也把114/514當作一組基,並命名為自然正交基,以與1919/810相區分。而為紀念浩二先生的偉大貢獻,人們將鏈接自然標準基與自然正交基的這一組變換命名為「浩二變換」。
歷史講完了,現在來看看證明吧
由田所引理,任何自然數均能由自然標準基1919/810表示,而根據浩二變換,自然標準基1919/810能通過係數493183/46170而由自然正交基114/514表示,因此很容易得出結論:任何自然數均能由自然正交基114/514表示。
證畢。
推薦閱讀: