我是C++大佬,我随手一写,没有保存,没有编译。
不喜勿喷。
为什么要在意大数?每个数就是mod 7和位数两个特点,统计数量就可以了。
为什么要去重?都说了是所有情况中有几个数。
例如
2
7 7
这个例子,输出应该是2,我认为不用去重。
#include <cmath> #include <iostream> #include <cstring> using namespace std; int main(){ int n,a,b; int d[7][7][12]={0}; int num[7][12]={0}; int mo[7]={1,3,2,6,4,5,1}; for(int i=0;i<7;i++) for(int j=0;j<7;j++) for(int k=1;k<12;k++){ int t=i*mo[k%6]+j; if(t%7==0) d[i][j][k]=1; else d[i][j][k]=0; } while(cin>>n){ memset(num,0,sizeof(num)); for(int i=0;i<n;i++){ cin>>a; b=(int)log10((double)a)+1; a%=7; num[a][b]++; } int res=0; for(int i=0;i<7;i++) for(int j=0;j<7;j++) for(int k=1;k<12;k++){ if(d[i][j][k]){ if(i!=j){ int sum=0; for(int l=1;l<12;l++) sum+=num[i][l]; res+=(num[j][k]*sum); } else{ int sum=0; for(int l=1;l<12;l++) sum+=num[i][l]; sum--; res+=(num[j][k]*sum); } } } cout<<res<<endl; } }
首先 我没去重, 但是这样只是提供你一个string 到 long long快速转换的方式。
然而这样的代码没有AC。。。我想哭的心都有~~!
可能会有其他简单方法吧,看到其他人的代码很多都是暴力方法。
#include<iostream>
#include<sstream>
#include<string>
using namespace std;
int main()
{
int n;
cin >> n;
string *x = new string[100001];
long long count = 0;
for (int i = 1; i <= n; i++)
cin >> x[i];
for (int i = 1; i != n; i++)
{
stringstream ss;
stringstream ss2;
string tmp;
string tmp2;
long long t;
long long t2;
for (int j = i + 1; j <= n; j++)
{
tmp = x[i] + x[j];
ss << tmp;
ss >> t;
if (t % 7 == 0)
count++;
tmp2 = x[j] + x[i];
ss2 << tmp2;
ss2 >> t2;
if (t2 % 7 == 0)
count++;
}
}
cout << count << endl;
system("pause");
return 0;
}
用C++写了一遍,过10%,换了下java,来大佬,看看能过多少
package demo1;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
int length = 0;
int i;
int sum=0;
int x;
String s;
Scanner scanner = new Scanner(System.in);
Scanner scanner1 = new Scanner(System.in);
length = scanner.nextInt();
int[] intArray = new int[length];
for( i=0;i<length;i++){
intArray[i]=scanner1.nextInt();
}
for( i=0;i<length;i++){
for(int j=0;j<length;j++)
{ if(i==0 && j==0)
{ }
else{
s=String.valueOf(intArray[i])+intArray[j]+"";
x = Integer.valueOf(s).intValue();
if(x%7==0)
{sum++;
System.out.println(x);
}
}
}
}
System.out.println(sum);
}
}
这题其实根本不需要考虑大整数,直接考虑mod 7就可以
C++ 100%:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n; int a[100005],f[11][7],b[11]; int getlen(int x) { int res = 0; for (;x > 0;x /= 10,res ++); return res; } int main() { scanf("%d",&n); for (int i = 1;i <= n;i ++) scanf("%d",&a[i]); memset(f,0,sizeof(f)); b[0] = 1; for (int i = 1;i <= 10;i ++) b[i] = b[i - 1] * 10 % 7; for (int i = 1;i <= n;i ++) { f[getlen(a[i])][a[i]%7] ++; } long long ans = 0; for (int i = 1;i <= n;i ++) { int k = getlen(a[i]); for (int j = 1;j <= 10;j ++) { ans += f[j][(7 - ((a[i] % 7) * b[j] % 7)) % 7]; if (k == j && ((a[i] % 7) * b[j] + a[i]%7)%7 == 0) ans --; } } cout << ans; }