容斥原理 幸運數字

2021-06-04 13:21:48 字數 1480 閱讀 8016

四川省選scoi2010第一試

幸運數字

【題目描述】

在中國,很多人都把6和8視為是幸運數字!lxhgww也這樣認為,於是他定義自己的「幸運號碼」是十進位制表示中只包含數字6和8的那些號碼,比如68,666,888都是「幸運號碼」!但是這種「幸運號碼」總是太少了,比如在[1,100]的區間內就只有6個(6,8,66,68,86,88),於是他又定義了一種「近似幸運號碼」。

lxhgww規定,凡是「幸運號碼」的倍數都是「近似幸運號碼」,當然,任何的「幸運號碼」也都是「近似幸運號碼」,比如12,16,666都是「近似幸運號碼」。

現在lxhgww想知道在一段閉區間[a,b]內,「近似幸運號碼」的個數。

【輸入】

輸入資料是一行,包括2個數字a和b

【輸出】

輸出資料是一行,包括1個數字,表示在閉區間[a,b]內「近似幸運號碼」的個數

【樣例輸入1】

1 10

【樣例輸出1】

【樣例輸入2】

1234 4321

【樣例輸出2】

【資料範圍】

對於30%的資料,保證1<=a<=b<=1000000

對於100%的資料,保證1<=a<=b<=10000000000

比較裸的容斥原理。首先打表生成了所有的6和8的組合,但又不是之前的數的倍數的數,總共有1000多個。

讀取的時候把大於b的都排除了。(注意一定要用降序。因為在搜尋的時候,加有剪枝,可以盡早剪掉大枝)

[a,b]的「近似幸運數字」=[1,b]的 - [1,a-1]的。

可以採用這種方法。在dfs裡列舉每乙個數字要或是不要,求最小公倍數(即求交集的過程)(如果要,一定要滿足最小公倍數小於edge)

如果要,就不變符號,如果不要,就變符號(減法實現)

但是注意這個程式有兩個問題:

1、如果每個數都不要,那麼最小公倍數會變成1,然後就會返回edge,這個是多餘的

2、考慮邊界上,如果只要最後乙個,則返回[edge/a[max]],而且是+,因此可知,符號全都反了

綜上,為了符合奇加偶減,則在最外面變一次號,因此多餘的edge變成了-edge,在加上edge。

#include #include typedef long long ll;

ll a;

ll b;

ll table=;

ll table2[2000];

ll cnt2 = 0;

long maxm = sizeof(table)/sizeof(ll)-1;

ll cnt = 0;

ll m;

inline ll dfs(long p,ll sum)

res += dfs(p+1,sum);

if (sum/g<=m/table2[p])

res -= dfs(p+1,sum/g*table2[p]);

return res;

}int main()

幸運數字 容斥原理 高精度與低精度的加 減 除

題目描述 lyk 最近運氣很差,例如在 noip 初賽中僅僅考了 90 分,剛剛卡進複賽,於是它決定使用一些方法來增加自己的運氣值。它覺得,通過收集幸運數字可以快速的增加它的 rp 值。它給幸運數字下了乙個定義 如果乙個數 x 能被 3 整除或被 5 整除或被 7 整除,則這個數為幸運數字。於是它想...

幸運數字 容斥原理 高精度與低精度的加 減 除

題目描述 lyk 最近運氣很差,例如在 noip 初賽中僅僅考了 90 分,剛剛卡進複賽,於是它決定使用一些方法來增加自己的運氣值。它覺得,通過收集幸運數字可以快速的增加它的 rp 值。它給幸運數字下了乙個定義 如果乙個數 x 能被 3 整除或被 5 整除或被 7 整除,則這個數為幸運數字。於是它想...

python幸運數字判斷 幸運數字 小程式

問題描述 1 n個數字,每個數字的範圍 9999到9999,把這n個數字排序後,刪除奇數字的數,然後把剩餘的數按原位置排序後繼續刪除奇數字,直到剩餘乙個數為止,剩餘的數就是幸運數,輸出幸運數和它最初的位置。程式的輸入為兩個引數 數字的數量 n 具體的資料 以空格隔開 比如 6 66 666 6666...