A:
1689能组成0-6任何余数,然后可以随意构造xxxxx0000 + (1689的某种排列),使得余数为0,末尾再补零。
code:
#include <algorithm> #include <iostream> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <string> #include <math.h> #include <vector> #include <queue> #include <stack> #include <cmath> #include <list> #include <set> #include <map> using namespace std; #define N 100010 #define ll long long #define ALL(x) x.begin(),x.end() #define CLR(x,a) memset(x,a,sizeof(x)) typedef pair<int,int> PI; const int INF=0x3fffffff; const int MOD =1000000007; const double EPS=1e-9; char s[N*10]; int d[]={1,6,8,9}; int cnt[10]; int main() { scanf("%s",s); int n=strlen(s); for(int i=0;i<n;i++) cnt[s[i]-'0']++; for(int i=0;i<4;i++) cnt[d[i]]--; int ans=0; for(int i=9;i>=1;i--){ while(cnt[i]--){ ans*=10; ans+=i; ans%=7; printf("%d",i); } } for(int i=0;i<4;i++) ans*=10; ans%=7; ans=((7-ans)%7); do{ int sum=0; for(int i=0;i<4;i++) sum*=10,sum+=d[i]; if((sum%7)==ans){ printf("%d", sum); break; } }while(next_permutation(d,d+4)); while(cnt[0]--) printf("0"); return 0; }
B:
算出每行的last[i],记录从i开始,连续的1最远能到哪。然后枚举起点x,把每行的last[x]-x加入vector,排序一下。扫一下vector就能算出面积了。
这题正解只要n^2,不过我1秒就过了。。。。
code:
#include <algorithm> #include <iostream> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <string> #include <math.h> #include <vector> #include <queue> #include <stack> #include <cmath> #include <list> #include <set> #include <map> using namespace std; #define N 100010 #define ll long long #define ALL(x) x.begin(),x.end() #define CLR(x,a) memset(x,a,sizeof(x)) typedef pair<int,int> PI; const int INF=0x3fffffff; const int MOD =1000000007; const double EPS=1e-9; char a[5010][5010]; int last[5010][5010],n,m; int solve(int l) { int Max=0; vector<int> d; for(int i=1;i<=n;i++){ if(last[i][l]-l>0) d.push_back(last[i][l]-l); } sort(ALL(d)); for(int i=0;i<d.size();i++){ Max=max(Max,(int)(d.size()-i)*d[i]); } return Max; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%s",a[i]+1); if(a[i][m]=='1') last[i][m]=m+1; else a[i][m]=m; for(int j=m-1;j>=1;j--){ if(a[i][j+1]=='1' && a[i][j]=='1') last[i][j]=last[i][j+1]; else if(a[i][j]=='1') last[i][j]=j+1; else last[i][j]=j; } } int ans=0; for(int i=1;i<=m;i++){ ans=max(ans,solve(i)); } printf("%d\n",ans); return 0; }