CS 400 8 Divisible 同余+模拟
来源:互联网 发布:半自动咖啡机推荐 知乎 编辑:程序博客网 时间:2024/06/07 08:21
题意:给出一个数 十进制长度为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整除.
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 <bits/stdc++.h>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){ if(n==3&&i==0) return false; int x=i*100+j*10+k; if(x%8) return false; int cnt[15]={0}; 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;}vector<string> res;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<cnt[i];j++) t+=i+'0'; t+=i+'0',t+=j+'0',t+=k+'0'; res.push_back(t);}char s[N];int main(){ memset(b,0,sizeof(b)); cin>>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<<a[1]<<endl; return 0; } if(n==2) { int x=a[1]*10+a[2],y=-1; if(a[2]!=0) y=10*a[2]+a[1]; if(x%8&&y%8) puts("-1"); else { if(x%8==0&&y%8==0) cout<<min(x,y)<<endl; else if(x%8) cout<<y<<endl; else cout<<x<<endl; } return 0; } bool flag=false; for(int i=0;i<10;i++) for(int j=0;j<10;j++) for(int k=0;k<10;k++) { if(check(i,j,k)) { print(i,j,k); flag=true; } } if(!flag) puts("-1"); else { sort(res.begin(),res.end()); cout<<res[0]<<endl; } return 0;}
阅读全文
0 0
- CS 400 8 Divisible 同余+模拟
- Divisible [数学]同余定理
- 模拟赛 同余
- CF 376C Divisible By Seven 同余+暴力
- NOIP模拟 Math 【同余】
- 【NOIP2016提高组模拟】同余
- 同余
- 同余
- 同余
- 同余
- 同余
- Codeforces 464C Substitutes in Number 同余定理+模拟
- 【JZOJ4744】【NOIP2016提高A组模拟9.2】同余
- 【NOIP2016提高A组模拟9.2】同余
- 同余【NOIP2016提高A组模拟9.2】
- 同余(数论基础)
- 线性同余方程
- 线性同余算法
- Java NIO:NIO概述
- 第3章:面向对象编程(day05-day07)
- shell-export
- [Ubuntu]虚拟机VirtualBox安装win7完整步骤
- 未优化的冒泡排序算法.c
- CS 400 8 Divisible 同余+模拟
- java字符串预习
- 原型链详解
- Fragment
- centos7.4编译reids4.0.2出现MALLOC=jemalloc错误
- linux进程地址空间
- 展讯平台android display驱动分析
- java注解
- 使用BottomTabBar实现底部导航,MVP网络框架,retrofit解析