1007 正整数分组 1010 只包含因子2 3 5的数 1014 X^2 Mod P 1024 矩阵中不重复的元素 1031 骨牌覆盖

1007 正整数分组

将一堆正整数分为2组,要求2组的和相差最小。

例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的。

Input

第1行:一个数N,N为正整数的数量。
第2 - N+1行,N个正整数。
(N <= 100, 所有正整数的和 <= 10000)

Output

输出这个最小差

Input示例

5
1
2
3
4
5

Output示例

1这题不就是小李打怪兽吗,不知道谁模仿谁,呵呵,刚还是我编的题里的,dp,证明一下(要证明什么自己考虑)。
 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cmath>
 5 #include<cstring>
 6 using namespace std;
 7
 8 int n,sum;
 9 bool boo[10007];
10
11 int main()
12 {
13     scanf("%d",&n);
14     boo[0]=true,sum=0;
15     int x;
16     for (int i=1;i<=n;i++)
17     {
18         scanf("%d",&x);
19         for (int j=10000;j>=x;j--)
20             if (boo[j-x]) boo[j]=true;
21         sum+=x;
22     }
23     int i=sum/2,j=sum-i;
24     while (!boo[i]||!boo[j]) i--,j++;
25     printf("%d\n",j-i);
26 }

1010 只包含因子2 3 5的数

K的因子中只包含2 3 5。满足条件的前10个数是:2,3,4,5,6,8,9,10,12,15。

所有这样的K组成了一个序列S,现在给出一个数n,求S中 >= 给定数的最小的数。

例如:n = 13,S中 >= 13的最小的数是15,所以输出15。

Input

第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000)
第2 - T + 1行:每行1个数N(1 <= N <= 10^18)

Output

共T行,每行1个数,输出>= n的最小的只包含因子2 3 5的数。

Input示例

5
1
8
13
35
77

Output示例

2
8
15
36
80枚举处理出在范围内的所有满足条件的数+排序,然后二分找答案就可以了。
 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cmath>
 5 #include<cstring>
 6 using namespace std;
 7
 8 typedef long long LL;
 9 const LL INF=1e18+7;
10
11 int n,cnt=0;
12 LL a[100007];
13
14 void init()
15 {
16     for (LL i=1;i<=INF;i*=2)
17         for (LL j=1;j*i<=INF;j*=3)
18             for (LL k=1;k*i*j<=INF;k*=5)
19                 a[++cnt]=i*j*k;
20     sort(a+1,a+cnt+1);
21 }
22 int main()
23 {
24     init();
25     scanf("%d",&n);
26     LL x;
27     for (int i=1;i<=n;i++)
28     {
29         scanf("%lld",&x);
30         printf("%lld\n",*lower_bound(a+2,a+cnt+1,x));
31     }
32 } 
                  1014 X^2 Mod P

X*X mod P = A,其中P为质数。给出P和A,求<=P的所有X。

Input

两个数P A,中间用空格隔开。(1 <= A < P <= 1000000, P为质数)

Output

输出符合条件的X,且0 <= X <= P,如果有多个,按照升序排列,中间用空格隔开。
如果没有符合条件的X,输出:No Solution

Input示例

13 3

Output示例

4 9
 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cmath>
 5 #include<cstring>
 6 using namespace std;
 7
 8 int top=0,p,a;
 9 int ans[1000007]={0};
10
11 int main()
12 {
13     scanf("%d%d",&p,&a);
14     for (int i=0;i<=p;i++)
15     {
16         long long x;
17         x=(long long)i*i;
18         if (x%p==a) ans[++top]=i;
19     }
20     if (top==0) printf("No Solution\n");
21     else
22     {
23         for (int i=1;i<top;i++)
24             printf("%d ",ans[i]);
25         printf("%d\n",ans[top]);
26     }
27 }

1024 矩阵中不重复的元素

一个m*n的矩阵。

该矩阵的第一列是a^b,(a+1)^b,.....(a + n - 1)^b

第二列是a^(b+1),(a+1)^(b+1),.....(a + n - 1)^(b+1)

.......

第m列是a^(b + m - 1),(a+1)^(b + m - 1),.....(a + n - 1)^(b + m - 1)

(a^b表示a的b次方)

下面是一个4*4的矩阵:

2^2=4, 2^3=8, 2^4=16, 2^5=32

3^2=9, 3^3=27, 3^4=81, 3^5=243

4^2=16, 4^3=64, 4^4=256, 4^5=1024

5^2=25, 5^3=125, 5^4=625, 5^5=3125

问这个矩阵里有多少不重复的数(比如4^3 = 8^2,这样的话就有重复了)

2^2=4, 2^3=8, 2^4=16, 2^5=32

3^2=9, 3^3=27, 3^4=81, 3^5=243

4^2=16, 4^3=64, 4^4=256, 4^5=1024

m = 4, n = 3, a = 2, b = 2。其中2^4与4^2是重复的元素。

Input

输入数据包括4个数:m,n,a,b。中间用空格分隔。m,n为矩阵的长和宽(2 <= m,n <= 100)。a,b为矩阵的第1个元素,a^b(2 <= a , b <= 100)。

Output

输出不重复元素的数量。

Input示例

4 3 2 2

Output示例

11一个hash的事情。
 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<iostream>
 5 #include<cstring>
 6 #include<map>
 7 using namespace std;
 8
 9 typedef long long LL;
10 const LL mod=132141367;
11
12 int m,n,a,b,ans;
13 map<int,bool>p;
14
15 int main()
16 {
17     scanf("%d%d%d%d",&m,&n,&a,&b);
18     ans=m*n;
19     for (int i=1;i<=n;i++)
20     {
21         LL x=1,jed=(a+i-1);
22         for (int j=1;j<b;j++)
23             x=x*jed%mod;
24         for (int j=1;j<=m;j++)
25         {
26             x=x*jed%mod;
27             if (p[x]) ans--;
28             else p[x]=true;
29         }
30     }
31     printf("%d\n",ans);
32 } 

1031 骨牌覆盖

在2*N的一个长方形方格中,用一个1*2的骨牌排满方格。

问有多少种不同的排列方法。

例如:2 * 3的方格,共有3种不同的排法。(由于方案的数量巨大,只输出 Mod 10^9 + 7 的结果)

Input

输入N(N <= 1000)

Output

输出数量 Mod 10^9 + 7

Input示例

3

Output示例

3
比铺砖块要水吧,转移的东西都少,一般的状态压缩。
 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<iostream>
 5 #include<cstring>
 6 using namespace std;
 7
 8 const int mod=1e9+7;
 9
10 int n,m,cnt=0;
11 int f[1007][7]={0};
12 struct Node
13 {
14     int x,y;
15 }next[7];
16
17 void dfs(int num,int sta,int old)
18 {
19     if (num>m) return;
20     if (num==m)
21     {
22         next[++cnt].x=old;
23         next[cnt].y=sta;
24         return;
25     }
26     dfs(num+1,(sta<<1)+1,old<<1);
27     dfs(num+2,sta<<2,old<<2);
28     dfs(num+1,sta<<1,(old<<1)+1);
29 }
30 int main()
31 {
32     scanf("%d",&n);
33     m=2;
34     dfs(0,0,0);
35     f[0][0]=1;
36     for (int i=1;i<=n;i++)
37         for (int j=1;j<=cnt;j++)
38         {
39             int x=next[j].x,y=next[j].y;
40             f[i][y]=(f[i][y]+f[i-1][x])%mod;
41         }
42     printf("%d\n",f[n][0]);
43 }
时间: 2024-08-05 19:36:28

1007 正整数分组 1010 只包含因子2 3 5的数 1014 X^2 Mod P 1024 矩阵中不重复的元素 1031 骨牌覆盖的相关文章

51nod 1010 只包含因子2 3 5的数(打表+排序+二分)

1010 只包含因子2 3 5的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 取消关注 K的因子中只包含2 3 5.满足条件的前10个数是:2,3,4,5,6,8,9,10,12,15. 所有这样的K组成了一个序列S,现在给出一个数n,求S中 >= 给定数的最小的数. 例如:n = 13,S中 >= 13的最小的数是15,所以输出15. Input 第1行:一个数T,表示后面用作输入测试的数的数量.(1 <= T <= 1000

51nod 1010 只包含因子2 3 5的数

基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 K的因子中只包含2 3 5.满足条件的前10个数是:2,3,4,5,6,8,9,10,12,15. 所有这样的K组成了一个序列S,现在给出一个数n,求S中 >= 给定数的最小的数. 例如:n = 13,S中 >= 13的最小的数是15,所以输出15. Input 第1行:一个数T,表示后面用作输入测试的数的数量.(1 <= T <= 10000) 第2 - T + 1行:每行1个数N(1 <=

51Nod 1010 只包含因子2 3 5的数 Label:None

K的因子中只包含2 3 5.满足条件的前10个数是:2,3,4,5,6,8,9,10,12,15. 所有这样的K组成了一个序列S,现在给出一个数n,求S中 >= 给定数的最小的数. 例如:n = 13,S中 >= 13的最小的数是15,所以输出15. Input 第1行:一个数T,表示后面用作输入测试的数的数量.(1 <= T <= 10000) 第2 - T + 1行:每行1个数N(1 <= N <= 10^18) Output 共T行,每行1个数,输出>= n

51NOD 1010 只包含因子2 3 5的数(二分 + 预处理)

传送门 K的因子中只包含2 3 5.满足条件的前10个数是:2,3,4,5,6,8,9,10,12,15. 所有这样的K组成了一个序列S,现在给出一个数n,求S中 >= 给定数的最小的数. 例如:n = 13,S中 >= 13的最小的数是15,所以输出15. Input 第1行:一个数T,表示后面用作输入测试的数的数量.(1 <= T <= 10000) 第2 - T + 1行:每行1个数N(1 <= N <= 10^18) Output 共T行,每行1个数,输出>

51Nod 1010 只包含因子2 3 5的数 | 预处理+二分

Input示例 5 1 8 13 35 77 Output示例 2 8 15 36 80 分析:将所有的只含有2 3 5因子的数打一个表保存在一个数组里,然后二分查找第一个>=数组里的数,输出 #include <bits/stdc++.h> using namespace std; typedef long long LL; #define rep(i,a,n) for(int i = a; i < n; i++) #define repe(i,a,n) for(int i =

51nod 1010 只包含因子2 3 5的数 &amp;&amp; poj - 1338 Ugly Numbers(打表)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1010 http://poj.org/problem?id=1338 首先poj这题要找出第n个丑数,想到要打表,因为每一个丑数都是由前一个丑数*2或者*3或者*5得到,每次取3种结果种较小的那一个放入数组中. 打表的时候要注意保持数组有序. 1 #include <iostream> 2 #include <cstdio> 3 #include <c

只包含因子2 3 5的数(数论,二分,加丑数思想)

个人心得:这题错了很多很多次,一开始单纯是想一直除2,3,5能除尽就可以了,但是数据太大,从第九组数据开始就超时了. 后面听了队友的意见打表,这里用了丑数的思想,就是从2,3,5开始依次取出最小的数分别乘以2,3,5若不存在就放进优先队列, 当然要用set就行存储,s.count()就是查找是否存在的函数,可惜还是超时了,应该是stl中的lower_bound函数效率太低, 没办法就只能用另外的数组存储然后自己根据二分写查找函数,后面对longlong进行适当的输出就过了. 题目: K的因子中只

51 Nod 1007 正整数分组【类01背包】

1007 正整数分组 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 将一堆正整数分为2组,要求2组的和相差最小. 例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的. Input 第1行:一个数N,N为正整数的数量. 第2 - N+1行,N个正整数. (N <= 100, 所有正整数的和 <= 10000) Output 输出这个最小差 Input示例 5 1 2 3 4 5 Output示例 1 题目链接

51 nod 1007 正整数分组 (简单01背包)

http://www.51nod.com/onlineJudge/questionCode.html#problemId=1007&noticeId=15020 求出n个数的和sum,然后用sum/2作为背包容量,让n个数去放,求出一个最大价值,那么这就是其中一组的和,另外一组的和就是sum-dp[sum/2]; 注意这里的体积和价值都是a[i]; 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath&