四川省選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...