[NOIP2009]多项式输出
题目描述
一元n次多项式可用如下的表达式表示:
f (x) = anxn+ an-1xn-1 + ... + a1x + a0,a0≠0
其中,aixi 称为i 次项,ai 称为i次项的系数。给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式:
1. 多项式中自变量为x,从左到右按照次数递减顺序给出多项式。
2. 多项式中只包含系数不为0的项。
3. 如果多项式n次项系数为正,则多项式开头不出现“+”号,如果多项式 n 次项系数为负,则多项式以“-”号开头。
4. 对于不是最高次的项,以“+”号或者“-”号连接此项与前一项,分别表示此项系数为正或者系数为负。紧跟一个正整数,表示此项系数的绝对值(如果一个高于0 次的项,其系数的绝对值为1,则无需输出1)。如果x的指数大于1,则接下来紧跟的指数部分的形式为“x^b”,其中b为x的指数;如果x的指数为1,则接下来紧跟的指数部分形式为“x”;如果x的指数为0,则仅需输出系数即可。
5. 多项式中,多项式的开头、结尾不含多余的空格。
输入描述:
第一行1个整数,n,表示一元多项式的次数。 第二行有n+1 个整数,其中第i 个整数表示第n-i+1 次项的系数,每两个整数之间用空格隔开。输出描述:
共1行,按题目所述格式输出多项式。示例1
输入
5 100 -1 1 -3 0 10
输出
100x^5-x^4+x^3-3x^2+10
输入
3 -50 0 0 1
输出
-50x^3+1
备注:
1≤n≤100,多项式各次项系数的绝对值均不超过100。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n ;
cin >> n;
int a[n + 1];
for(int i = n;i >= 0;i -- ) cin >> a[i];
for(int i = n;i >= 0;i -- ){//注意:n次多项式有n + 1项
if(a[i]){//系数不为0
if(i != n && a[i] > 0) cout << '+';//非首项且系数大于0
if((a[i] != -1 && a[i] != 1) || i == 0) cout << a[i];//系数不是正负1或为常数项
if(a[i] == -1 && i != 0) cout << '-';//-1的非零次指数特判
if(i == 1) cout << 'x';//一次指数
if(i > 1) cout << "x^"<< i;//二次及以上指数
}
}
return 0;
}
[NOIP2008]火柴棒等式
题目描述
给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字0-9的拼法如图所示:
注意:
1. 加号与等号各自需要两根火柴棍
2. 如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C>=0)
3. n根火柴棍必须全部用上
输入描述:
共一行,又一个整数n(n<=24)。输出描述:
共一行,表示能拼成的不同等式的数目。示例1
输入
14
输出
2说明
2个等式为0+1=1和1+0=1。示例2
输入
18输出
9
说明
9个等式为: 0+4=4 0+11=11 1+10=11 2+2=4 2+7=9 4+0=4 7+2=9 10+1=11 11+0=11
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
int a[10] = {6,2,5,5,4,5,6,3,7,6};
int cal(int n){
int num = 0;
for(int i = n;i != 0;i /= 10) num += a[i % 10];
if(n == 0) num += a[0];
return num;
}
int main(){
int n;
cin >> n;
int ans = 0;
for(int i = 0;i <= N;i ++ ){
for(int j = 0;j <= N;j ++ ){
int k = i + j;
if(cal(i) + cal(j) + cal(k) + 2 + 2 == n) ans ++ ;
}
}
cout <<ans;
}
[NOIP2012]质因数分解
题目描述
已知正整数n是两个不同的质数的乘积,试求出较大的那个质数。
输入描述:
输入只有一行,包含一个正整数n。输出描述:
输出只有一行,包含一个正整数p,即较大的那个质数。示例1
输入
21输出
7备注:
对于60%的数据,6≤n≤1000。
对于100%的数据,6≤n≤2*109。
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
for (int i = 2; i <= n; i ++ ){
if(n % i == 0){
cout << n / i;
break;
}
}
return 0;
}
[NOIP2001]数的计算
题目描述
我们要求找出具有下列性质数的个数(包含输入的自然数n):
先输入一个自然数n(n ≤ 1000),然后对此自然数按照如下方法进行处理:
1.不作任何处理;
2.在它的左边加上一个自然数,但该自然数不能超过原数的一半;
3.加上数后,继续按此规则进行处理,直到不能再加自然数为止.输入描述:
1个自然数n( n ≤ 1000 )输出描述:
示例1
输入
6
输出
6
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;
int main(){
int n;
cin >> n;
int a[N] = {0};//千万别忘赋初值!!牛客不能写a[n]
for(int i = 1;i <= n;i ++ ){
for(int j = 1;j <= i / 2;j ++ ){
a[i] += a[j];
}
a[i] ++ ;
}
cout << a[n];
return 0;
}
[NOIP2014]珠心算测试
题目描述
珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。
某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和?
最近老师出了一些测验题,请你帮忙求出答案
输入描述:
输入共两行,第一行包含一个整数 n ,表示测试题中给出的正整数个数。 第二行有 n 个正整数,每两个正整数之间用一个空格隔开,表示测试题中给出的正整数。输出描述:
输出共一行,包含一个整数,表示测验题答案。示例1
输入
4 1 2 3 4输出
2说明
由 1+2=3,1+3=4 ,故满足测试要求的答案为 2 。 注意,加数和被加数必须是集合中的两个不同的数。备注:
对于 100% 的数据, 3 ≤ n ≤ 100 ,测验题给出的正整数大小不超过 10,000 。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;//数组千万别开小了。
int main(){
int n;
cin >> n;
int a[n + 1] ,test[N];
for(int i = 1;i <= n;i ++ ) {
cin >> a[i];
test[a[i]] = 1;
}
int ans = 0;
for(int i = 1;i < n;i ++ ){
for(int j = i + 1;j <= n;j ++ ){
if(test[a[i] + a[j]]){
ans ++ ;
test[a[i] + a[j]] = 0;
}
}
}
cout << ans;
return 0;
}