題意:給出乙個數 十進位制長度為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 ...