CS 400 8 Divisible 同餘 模擬

2021-08-10 09:00:52 字數 1245 閱讀 7773

題意:給出乙個數 十進位制長度為n,問該數是否能通過重新排列digit使得其被8整除.(不能有前導0)

n<=1000.若有解 找到最小的乙個解,並且輸出重新排列後的數,否則輸出-1.

由10^j≡0(mod 2^j) (定義歸納證明)  p*10^3≡0(mod 2^3) 

x=10^n *a[n]+...10*a[1]+a[0]  若100*a[2]+10*a[1]+a[0]能被8整除,則x能被8整除.

列舉最後三位數,若無前導0並且和合法 則用字串儲存該可行解 最後輸出最小的即可.o(n^2).

#include using namespace std;

typedef unsigned long long ll;

const int n=2e5+5,m=15,inf=0x3f3f3f3f;

int n,a[n],b[n];

bool check(int i,int j,int k)

; cnt[i]++,cnt[j]++,cnt[k]++;

for(int i=0;i<10;i++)

if(cnt[i]>b[i])

return false;

bool res=true;

if(b[0]-cnt[0]>0)

res=false;

for(int i=1;i<10;i++)

if(b[i]!=cnt[i])

res=true;

return res;

}vectorres;

void print(int i,int j,int k)

{ int cnt[15];

for(int i=0;i<10;i++)

cnt[i]=b[i];

cnt[i]--,cnt[j]--,cnt[k]--;

int p=1;

while(cnt[p]==0&&p<10)

p++;

cnt[p]--;

string t="";

if(p<10)

t+=p+'0';

for(int i=0;i<10;i++)

for(int j=0;j>s;

n=strlen(s);

for(int i=1;i<=n;i++)

a[i]=s[i-1]-'0',b[a[i]]++;

if(n==1)

{if(a[1]%8)

puts("-1");

else

cout<

OJ4008 糖果 各種dp之3

就是乙個英雄瞎搞之類為世界作出貢獻,藍後某zz公司免費給他糖,然後由於某些原因他只能拿能整除k數量糖果,然後每個盒子裡有一定數量的糖果,拿了盒子就必須拿完裡面所有的糖果,求他怎麼拿的最多。5 7 1 2 3 4 5dzx的選擇是2 3 4 5 14,這樣糖果總數是7的倍數,並且是總數最多的選擇。em...

bzoj4008 亞瑟王 概率dp

重述題意 卡牌有發動概率和傷害,每張卡牌只發動一次,按順序遍歷,給出輪數,求傷害期望。神思路啊 我的腦子基本想不出來 如果說正面剛,剛一天也剛不掉,我們換個思路,用f i j 表示第i張卡被遍歷j次的概率。這個概率可以分為兩部分 1 第i 1張卡被遍歷j次且一直沒發動。這一段公式為f i 1 j 1...

BZOJ 4008 亞瑟王 概率DP 奧妙重重

題意 中文題面,就不解釋了 分析顯然這道題直接求期望太麻煩,想想轉化問題 這轉化太神了 定義f i,j f i,j 表示第i i張卡總共被經過j j次的概率,有轉移方程式f i,j f i 1,j 1 pi 1 j f i 1,j 1 1 1 pi 1 j 1 f i,j f i 1,j 1 pi ...