全部评论
/*#include <iostream>
#include <cmath>
#include <string>
#include <set>
#include <string.h>
#include <algorithm>
#include <vector>
#include <map>
#include <stack>
#include <queue>
#define MAXX (10000)
using namespace std;
int main() {
int n;
int getD(int);
int dd[11];
dd[0] = 1;
for (int i = 1; i <11; i++) {
dd[i] = (dd[i - 1] * 10) % 7;
}
while (cin >> n) {
vector<int> v;
for (int i = 0; i < n; i++) {
int t;
cin >> t;
v.push_back(t);
}
int count = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j) continue;
int temp = 0;
temp = temp+(v[i] % 7)*dd[getD(v[j])];
temp %= 7;
temp = (temp + v[j]) % 7;
if (temp == 0) count += 1;
}
}
cout << count << endl;
}
}
int getD(int n) {
if (n <= 9) return 1;
int i = 0;
while (n != 0) {
i += 1;
n /= 10;
}
return i;
}
----------------------------------上面是O(n^2)解法--------------------------------------
----------------------------------下面是O(n)解法----------------------------------------*/
#include <iostream>
#include <cmath>
#include <string>
#include <set>
#include <string.h>
#include <algorithm>
#include <vector>
#include <map>
#include <stack>
#include <queue>
#define MAXX (10000)
using namespace std;
int main() {
int n;
int getD(int);//这个数几位数
int dd[11]; //dd[i]=(10^i)%7
dd[0] = 1;
for (int i = 1; i <11; i++) {
dd[i] = (dd[i - 1] * 10) % 7;
}
int tongyujie[7] = { 0,1,4,5,2,3,6 }; //tongyujie[i]*i=0(mod 7)
while (cin >> n) {
int s0 = 0, s1 = 0, s2 = 0, s3 = 0, s4 = 0, s5 = 0, s6 = 0;//sn表示除7余n数的个数
vector<int> v;
for (int i = 0; i < n; i++) {
int t;
cin >> t;
v.push_back(t);
switch (t % 7) {
case 0:s0 += 1; break;
case 1:s1 += 1; break;
case 2:s2 += 1; break;
case 3:s3 += 1; break;
case 4:s4 += 1; break;
case 5:s5 += 1; break;
case 6:s6 += 1; break;
default:;
}
}
int count = 0;
for (int i = 0; i < n; i++) {
int yushu = v[i] % 7;
int temp = ((7 - yushu)*tongyujie[dd[getD(v[i])]]) % 7;
//std::cout <<endl<< yushu << " " << temp << endl;
if (yushu == temp) count -= 1;//自身和自身不能同时取到
switch (temp) {
case 0:count += s0; break;
case 1:count += s1; break;
case 2:count += s2; break;
case 3:count += s3; break;
case 4:count += s4; break;
case 5:count += s5; break;
case 6:count += s6; break;
default:;
}
}
std::cout << count << endl;
}
}
int getD(int n) {
if (n <= 9) return 1;
int i = 0;
while (n != 0) {
i += 1;
n /= 10;
}
return i;
}
第二题没啥说的。居然一遍过一脸蒙蔽。 #include <iostream>
#include <cmath>
#include <string>
#include <set>
#include <string.h>
#include <algorithm>
#include <vector>
#include <map>
#include <stack>
#include <queue>
#define MAXX (10000)
using namespace std;
int main() {
int n;
while (cin >> n) {
vector<int> v;
for (int i = 0; i < n; i++) {
int t;
cin >> t;
v.push_back(t);
}
int count = 1;
for (int i = 0; i < n - 1; i++) {
if (v[i] != v[i + 1]) count += 1;
}
if (v[0] == 0) count += 1;
if (count % 2 == 0) {
cout << "Bob" << endl;
}
else {
cout << "Alice" << endl;
}
}
}
第一题如果直接二重循环的话只能到70%所以一定把时间复杂度降下来。 题的意思说到底就是找两个数a和b满足a*(10^b的数位数加一)+b整体同余7为0的方程。 中间防溢出可以先同余7。 那么根据上面的方程我们可以知道a%7=((0-b%7)*(10^b的数位数加一)的逆)%7。 [关于同余,一次同余式方程解法,逆等的概念请百度或者离散数学。]。 所以只要遍历b就可以了时间到了O(n)。
没笔,看了下整除7那道题,我的想法是, 用map对每个数a保存,a%7, a*10%7...数据范围a<1e9,所以总共有10个。然后判断,比如127,保存127%7, 1270%7, 12700%7.... 然后遍历数组,对于每个数x,m = x%7,在map里找key为7-m长度为x的长度的value即可,时间复杂度是O(nlogn)
更新一个数组a[x][y][z]表示 位数为x的数乘以10的y次方%7 = a[x][y][z];边更新这个数组边做就OK了。 ——来自某位大佬思路 渣渣只有70%
10%的应该是没有考虑溢出,我考虑溢出以后就70%,妈的就是不能AC
被7整除,暴力只ac了 70%,,,,
被7整除如何能不超时呢
膜拜大佬
思路分享下啊大牛
大神说一下思路被
大神被7整除是什么个思路
牛
相关推荐
点赞 评论 收藏
分享
程序员小白条:简历修改700....神奇,又不是帮你面试,咋的,简历修改从双非变92了还是没实习变成有大厂实习了
点赞 评论 收藏
分享
06-03 23:37
广州工商学院 单片机 点赞 评论 收藏
分享