MT39. 被 7 整除
描述
输入描述
第一行包含一个整数n。
第二行包含n个正整数ai。
输出描述
输出对应的答案。示例1
输入:
3 127 1996 12
输出:
4
说明:
一共有4种组合方式,其中:把12写在1996前面得到121996;把127写在12前面得到12712;把1996写在12前面得到199612;把1996写在127前面得到1996127;都是可以被7整除的,其余的组合方式不能被7整除。C++ 解法, 执行用时: 13ms, 内存消耗: 996KB, 提交时间: 2020-10-29
#include<vector> #include <cstdio> using namespace std; int main() { vector<vector<int> > dp(10,vector<int>(7,0)); vector<int> cnt(7,0); vector<int> num(10,10); for (int i=1;i<10;++i) num[i]=10*num[i-1]; int n,v,x,y; scanf("%d",&n); for (int i=0;i<n;++i) { scanf("%d",&v); x=0; while (v/num[x]) ++x; y=v%7; ++cnt[y]; ++dp[x][y]; } long res=(cnt[0]-1)*cnt[0]; for (int i=1;i<7;++i){ if (cnt[i]==0) continue; for (int x=0;x<10;++x){ for (int y=0;y<7;++y){ if (dp[x][y]==0) continue; if (i*num[x]%7==7-y){ if (i==y) res+=(cnt[i]-1)*dp[x][y]; else res+=cnt[i]*dp[x][y]; } } } } printf("%ld",res); }
C++ 解法, 执行用时: 13ms, 内存消耗: 996KB, 提交时间: 2020-07-28
#include<vector> #include <cstdio> using namespace std; int main() { vector<vector<int> > dp(10,vector<int>(7,0)); vector<int> cnt(7,0); vector<int> num(10,10); for (int i=1;i<10;++i) num[i]=10*num[i-1]; int n,v,x,y; scanf("%d",&n); for (int i=0;i<n;++i) { scanf("%d",&v); x=0; while (v/num[x]) ++x; y=v%7; ++cnt[y]; ++dp[x][y]; } long res=(cnt[0]-1)*cnt[0]; for (int i=1;i<7;++i){ if (cnt[i]==0) continue; for (int x=0;x<10;++x){ for (int y=0;y<7;++y){ if (dp[x][y]==0) continue; if (i*num[x]%7==7-y){ if (i==y) res+=(cnt[i]-1)*dp[x][y]; else res+=cnt[i]*dp[x][y]; } } } } printf("%ld",res); }