链接:https://ac.nowcoder.com/acm/contest/1087/B
来源:牛客网
114514
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
题目描述
给你一个长为n的序列
定义一个序列下标的子集为先辈,当且仅当选出的这些下标对应的序列值的乘积为114514,而且因为只有一只野兽,所以有个要求是选出来的这些下标所对应的序列值最多有一个1
请输出有多少先辈
输入描述:
第一行一个数表示n 之后一行n个数表示这个序列 n <= 229028,序列的值域在[0,1145141919]中
输出描述:
输出一行一个数表示答
示例1
输入
复制
2 1 114514
输出
复制
2
ll f[]= {0,1,2,31,62,1847,3694,57257,114514};
它就这些因数,而且乘积能组成114514的只有 (a[114514]+a[2]*a[31]*a[1847]+a[2]*a[57257]+a[62]*a[57257])
仔细观察,每一个乘积相乘的那几个数,总有不能继续分解的,所以只是简单的这些数的组合!
还要注意要用unsinged long long。
#include <algorithm> //STL通用算法
#include <bitset> //STL位集容器
#include <cmath>
#include <cstdio>
#include <cstring>
#include <deque> //STL双端队列容器
#include <exception> //异常处理类
#include <fstream>
#include <functional> //STL定义运算函数(代替运算符)
#include <limits>
#include <list> //STL线性列表容器
#include <map> //STL 映射容器
#include <iomanip>
#include <ios> //基本输入/输出支持
#include<iosfwd> //输入/输出系统使用的前置声明
#include <iostream>
#include <istream> //基本输入流
#include <ostream> //基本输出流
#include <queue> //STL队列容器
#include <set> //STL 集合容器
#include <sstream> //基于字符串的流
#include <stack> //STL堆栈容器
#include <string> //字符串类
#include <vector> //STL动态数组容器
#define ll unsigned long long
using namespace std;
#define rep(i,a,b) for(register ll i=(a);i<=(b);i++)
#define dep(i,a,b) for(register ll i=(a);i>=(b);i--)
//priority_queue<ll,vector<ll>,less<ll> >q;
const ll maxn = 229028+66;
const ll maxm=900000+66;
const ll mod=1e9+7;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
const ll INF=99999999;
ll tot=0;
ll n;
bool vis[maxn];
ll f[]= {0,1,2,31,62,1847,3694,57257,114514};
map<ll,ll>dp;
bool ok(ll x)
{
rep(i,2,8)
{
if(f[i]==x)
return true;
}
return false;
}
ll a[maxn];
int main()
{
ll n;
while(scanf("%lld",&n)!=EOF)
{
//rep(i,1,n)a[i]=0;
rep(i,1,n)
{
ll v;
scanf("%lld",&v);
if(v<200000)
{
a[v]++;
}
}
ll ans=(a[1]+1)*(a[114514]+a[2]*a[31]*a[1847]+a[2]*a[57257]+a[62]*a[57257]);
printf("%lld\n",ans);
}
return 0;
}