1007 正整数分组 1010 只包含因子2 3 5的数 1014 X^2 Mod P 1024 矩阵中不重复的元素 1031 骨牌覆盖
Posted Kaiser
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
以上是关于1007 正整数分组 1010 只包含因子2 3 5的数 1014 X^2 Mod P 1024 矩阵中不重复的元素 1031 骨牌覆盖的主要内容,如果未能解决你的问题,请参考以下文章