51Nod 1333 無聊的數學家們

2021-07-26 09:26:49 字數 1237 閱讀 9757

問題來自於乙個精彩的故事:

有三個數學家,a,b與c。a選了兩個正整數x與y滿足x<=y。然後,a將x+y的值告訴了b,a又將x*y的值告訴了c。b與c都不知道x與y分別是什麼,也不知道對方得到的值是什麼。但b和c知道a告訴b的值是某兩個正整數的「和」而告訴c的值是這兩個數的「積」。而且這三個數學家的數學功底足夠好。下面是b與c進行的對話:

b:「我確定你一定沒有百分百的把握猜中我得到的數。」

c:「謝謝你的提示。現在我能確定你獲得的數是 s。」

故事結束,回到問題。

這個故事中一共涉及3個未知引數x,y與s,其實由於s=x+y,所以實際一共只有兩個未知引數而已。你可以帶入一些正整數讓這個故事沒有邏輯漏洞。現在問題來了,在區間[l,r]上存在多少個數值t,使s=t時能找到對應的x與y,並讓這個故事成立。輸出這些t的和(1<=l<=r<=5,000,000)。

首先很顯然,c得到的數肯定不是質數,因為如果是質數的話,那麼c肯定就可以馬上才出來對方的數。

那麼b既然知道c肯定猜不出來,就說明b在告訴c:」我的數不是質數加一」。

然後c為什麼就猜出來了呢?肯定是只有唯一解。

首先,c拿到的數肯定合數x,然後一+x肯定合法,那麼其他沒分貢獻。所以所以組成的x,y,肯定出了1,xy其他的x+y-1都是質數。

然後篩一下就好了。

#include

#include

#include

#include

#include

#define fo(i,a,b) for(i=a;i<=b;i++)

using

namespace

std;

typedef

long

long ll;

const

int maxn=5e6+7;

ll i,j,k,l,t,n,m,ans;

bool bz[maxn];

ll p[maxn],sum[maxn];

int main()

}fo(i,1,5000000)sum[i]=i;

fo(i,2,5000000)

}fo(i,1,5000000)if(!bz[i])sum[i+1]=0;

sum[1]=sum[2]=0;

fo(i,1,5000000)sum[i]+=sum[i-1];

scanf("%lld",&t);

while(t--)

}

51nod 1333 無聊的數學家

很有趣的題目。首先,怎麼知道對方無法100 猜中?考慮對方什麼時候100 猜中。顯然是拿了個質數。因此和s一定不可以被表示成質數 1,不然對方100 猜中。b說的那句話也就是告訴了c這樣的資訊 我的數不是質數 1 那麼為什麼c就猜出來了呢?肯定有唯一解!假設c拿到的是p,p為合數。對於1 p p這組...

51nod 1333 無聊的數學家們

問題來自於乙個精彩的故事 有三個數學家,a,b與c。a選了兩個正整數x與y滿足x y。然後,a將x y的值告訴了b,a又將x y的值告訴了c。b與c都不知道x與y分別是什麼,也不知道對方得到的值是什麼。但b和c知道a告訴b的值是某兩個正整數的 和 而告訴c的值是這兩個數的 積 而且這三個數學家的數學...

數學家劉徽的故事

劉徽 中國數學史上乙個非常偉大的數學家,他的傑作 九章算術注 和 海島算經 是中國最寶貴的數學遺產。他的主要著作有 九章算術注 10卷 重差 1卷,至唐代易名為 海島算經 九章重差圖 l卷。可惜後兩種都在宋代失傳。九章算術 約成書於東漢之初,共有246個問題的解法。在許多方面 如解聯立方程,分數四則...