CodeForces - 375A Divisible by Seven(数学)

https://vjudge.net/problem/48715/origin

题意:给出必定含1689四个数字的字符串,随意交换位置构造出能被7整除的数。

分析:数学思维题。观察发现1689的排列与7的余数恰好是0...6,那么利用这个性质去与串中其他数字相补出能被7整除的数,把1689固定在后四位,把0独自提取出来,其他数字为一组,把它们的数值*10000后mod7,根据得到的余数选择相应的1689排列,最后把0放在末尾(对结果正确性没有影响)。
代码:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cmath>
 4 #include <algorithm>
 5 #include <cstdlib>
 6 #include <cstring>
 7 #include <queue>
 8
 9 #define LL long long
10
11 using namespace std;
12
13 char s[1001000];
14 char w[1001000];
15
16 bool mark[11];
17
18 int main()
19 {
20
21     memset(mark,false,sizeof(mark));
22
23     LL top = 0,sum = 0,i,Zero = 0;
24
25     cin>>s;
26
27     int len = strlen(s);
28
29     for(i = 0;i < len; ++i)
30     {
31         if((s[i] == ‘1‘ || s[i] == ‘6‘ || s[i] == ‘8‘ || s[i] == ‘9‘) && mark[s[i]-‘0‘] == false)
32         {
33             mark[s[i]-‘0‘] = true;
34         }
35         else if(s[i] == ‘0‘)
36         {
37             Zero ++;
38         }
39         else
40         {
41             w[top++] = s[i];
42         }
43     }
44
45     for(i = 0;i < top; ++i)
46     {
47         sum *= 10;
48         sum += (w[i]-‘0‘);
49         sum %= 7;
50     }
51
52     sum *= 10000;
53     sum %= 7;
54
55     for(i = 0;i < top; ++i)
56     {
57         printf("%c",w[i]);
58     }
59
60     switch(sum)
61     {
62         case 0:printf("1869");break;
63         case 6:printf("1968");break;
64         case 5:printf("1689");break;
65         case 4:printf("6198");break;
66         case 3:printf("8691");break;
67         case 2:printf("9861");break;
68         case 1:printf("8196");break;
69     }
70
71     while(Zero--)
72     {
73         printf("0");
74     }
75     cout<<endl;
76
77     return 0;
78 }
时间: 2024-11-11 21:42:05

CodeForces - 375A Divisible by Seven(数学)的相关文章

CodeForces 449C Jzzhu and Apples 数学+素数

这道题目晚上本来就花了很多把都××了,着实觉得自己思路没错啊,回顾一下思路,给你n个数,分成两两组合一对,分成最多组如何分,但是组合的两个数 不能互素,所以呢 偶数肯定是好的了,所以先放着,先把素数给搞定,10^5所以枚举所有包含该素数因子的数,如果刚好分组则最好,不然的话其中有偶数的踢掉一个给下面的偶数处理部分,最后再处理偶数的部分,这样肯定满足组数最多,完全没有问题,后来方法确实是没问题啊,只是代码有问题,我靠!真是脑残!,今天看到一位大牛的想法,我跟他是一样的,只是代码写搓了,后来改了又改

Codeforces Round #259(div2)C(数学期望)

数学题. 关键是求最大值为k时有多少种情况,结果是kn-(k-1)n-1.可以这么想:每一次都从1至k里选,共kn种,这里需要再减去每一次都从1至k-1里面选的情况.当然也可以分类计数法:按出现几次k来分类,然后逆着用一下二项式定理得出结论. 整个的期望是Σk(kn-(k-1)n-1)/mn,其中k=1......n. 这里的技巧在于:由于n<=105,   kn显然会RE,那么就先把分母除上,每次算一个小于1的浮点数的n次方,肯定不会RE.C++中乘方用pow函数算是很快的. #include

CodeForces 567C. Geometric Progression(map 数学啊)

题目链接:http://codeforces.com/problemset/problem/567/C C. Geometric Progression time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Polycarp loves geometric progressions very much. Since he was on

CodeForces 215B Olympic Medal(数学啊)

题目链接:http://codeforces.com/problemset/problem/215/B Description The World Programming Olympics Medal is a metal disk, consisting of two parts: the first part is a ring with outer radius of r1 cm, inner radius of r2 cm, (0?<?r2?<?r1) made of metal wi

CodeForces 469B. Chat Online(数学)

题目链接:http://codeforces.com/problemset/problem/469/B B. Chat Online time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Little X and Little Z are good friends. They always chat online. But both

CodeForces 468A. 24 Game(数学构造)

题目链接:http://codeforces.com/problemset/problem/468/A A. 24 Game time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Little X used to play a card game called "24 Game", but recently he has f

Codeforces 577B Modulo Sum:数学 结论【选数之和为m的倍数】

题目链接:http://codeforces.com/problemset/problem/448/C 题意: 给你n个数字,给定m. 问你是否能从中选出若干个数字,使得这些数字之和为m的倍数. 题解: 其实就是要找一些数字,使得之和mod m为0. 开一个vector,存当前已经能够构成的数字之和mod m之后的值. 一开始vector为空,然后枚举n个数字a[i],对于每个数字枚举当前vector中的值v[i],将没有出现过的(a[i]+v[i])%m值加入vector中. 最后判断下vec

codeforces 616E. Sum of Remainders 数学

题目链接 给两个数n, m. 求n%1+n%2+.......+n%m的值. 首先, n%i = n-n/i*i, 那么原式转化为n*m-sigma(i:1 to m)(n/i*i). 然后我们可以发现  1/4 = 2/4 = 3/4 = 0, 4/4 = 5/4 = 6/4 = 7/4 = 1. 所以可以将这些结果分成很多块, 按块算结果. 注意计算过程中时刻避免爆longlong. #include <iostream> #include <vector> #include

Codeforces Amr and Chemistry(数学+乱搞)

题意:给n个数,每个数每次可以乘二或除以二(向下取整相当于左移或右移),问最少经过多少次操作可以使这n个数变相等. 思路:首先考虑每个数的可能取值,将一个数表示成s*2^k的形式,s是奇数. 那么这个数的所有可能取值为s'*2^x,(s'=s/2,(s/2)/2,.....)且s'*2^x<=100000 因为这题数据范围不大,而且每个值可能的取值不多最多几百个,所以记录1到100000每个值可能被取到的次数以及总操作数,最后从1遍历到100000取最小的ans即可 ps:个人赛这道题做了一下午