AtCoder Beginner Contest 169
A - Multiplication 1
题目描述
输出A * B
代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef unsigned long long ll;
//__builtin_popcount(n);
#define IOS ios::sync_with_stdio(false); cin.tie(0);cout.tie(0)
#define RI register int
const int MOD = 1e9 + 7;
const double PI = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int SZ = 2e5 + 10;
int n;
int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",a * b);
return 0;
}
B - Multiplication 2
题目描述
求A1 * A2 * … * An
2 ≤ N ≤ 10^5
0 ≤ Ai ≤ 10^18
如果超过1e18 输出 -1
Solution
Java大数
代码
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String args[])
{
Scanner cin = new Scanner(System.in);
int n;
n = cin.nextInt();
BigInteger x,ans;
ans = new BigInteger("1");
int flag = 0;
for(int i = 1;i <= n;i ++)
{
x = cin.nextBigInteger();
if(x.compareTo(BigInteger.valueOf(0)) == 0)
{
ans = BigInteger.valueOf(0);
flag = 1;
}
if(flag == 0) ans = ans.multiply(x);
if(ans.compareTo(new BigInteger("1000000000000000000")) > 0) flag = 1;
}
if(ans.compareTo(new BigInteger("1000000000000000000")) > 0)
{
System.out.println("-1");
}
else System.out.println(ans);
}
}
C - Multiplication 3
题目描述
A * B
0 ≤ A ≤ 10^15
0 ≤ B < 10
A是正整数
B是有2位小数的浮点数
Solution
long double 存
结果下取整
代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
//__builtin_popcount(n);
#define IOS ios::sync_with_stdio(false); cin.tie(0);cout.tie(0)
#define RI register int
const int MOD = 1e9 + 7;
const double PI = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int SZ = 2e5 + 10;
int n;
long double a,b;
int main()
{
cin >> a >> b;
cout << (ll)(a * b) << endl;
return 0;
}
D - Div Game
题目描述
给定一个数n,每次把它除以一个质数的幂。最多可以除以多少个不同的数。
Solution
处理出素因子的个数,然后从小的幂次开始选,统计答案即可。
代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
//__builtin_popcount(n);
#define IOS ios::sync_with_stdio(false); cin.tie(0);cout.tie(0)
#define RI register int
const int MOD = 1e9 + 7;
const double PI = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int SZ = 2e5 + 10;
ll n;
vector<int> prime_factor(ll n)
{
vector<int> res;
for(ll i = 2;i * i <= n;i ++)
{
int temp = 0;
while(n % i == 0)
{
temp ++;
n /= i;
}
if(temp != 0) res.push_back(temp);
}
if(n != 1) res.push_back(1);
return res;
}
int main()
{
scanf("%lld",&n);
vector<int> prime = prime_factor(n);
ll ans = 0;
for(auto x: prime)
{
int now = 1;
while(x - now >= 0)
{
x -= now;
now ++;
ans ++;
}
}
printf("%lld\n",ans);
return 0;
}
E - Count Median
题目描述
给你n个区间,每个区间是在Ai到Bi之间,从每个区间中取出一位数,并求出这些数的中位数。问中位数有多少种取值可能。n为偶数时,中位数是中间两个数的平均数,可能有1/2的出现。
Solution
结论:最小和最大的中位数之间的所有可能的中位数都是一定可以取到的。
偶数和奇数分开处理即可。
代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
//__builtin_popcount(n);
#define IOS ios::sync_with_stdio(false); cin.tie(0);cout.tie(0)
#define RI register int
const int MOD = 1e9 + 7;
const double PI = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int SZ = 2e5 + 10;
int n;
ll A[SZ],B[SZ];
int main()
{
scanf("%d",&n);
for(int i = 1;i <= n;i ++) scanf("%lld%lld",&A[i],&B[i]);
sort(A + 1,A + n + 1);
sort(B + 1,B + n + 1);
if(n % 2 == 1) printf("%lld\n",B[n / 2 + 1] - A[n / 2 + 1] + 1);
else printf("%lld\n",B[n / 2] + B[n / 2 + 1] - A[n / 2] - A[n / 2 + 1] + 1);
return 0;
}
F - Knapsack for All Subsets
题目描述
求序列 A 的所有连续子段的 满足元素的和等于 S 的子序列数量 的和。
Solution
背包问题变式
令dp[i][j]为前i个数中区间大小不超过i的有至少一个子集的元素和为j的集合个数(多个不同子集和为j则记录多次)
dp[i][j] = dp[i - 1][j](大小不超过i - 1的) + dp[i - 1][j](大小为i的) +dp[i - 1][j - A[i]]
dp[i][j] = dp[i - 1][j] * 2 + dp[i - 1][j - A[i]]
代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
//__builtin_popcount(n);
#define IOS ios::sync_with_stdio(false); cin.tie(0);cout.tie(0)
#define RI register int
const int MOD = 998244353;
const double PI = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int SZ = 2e5 + 10;
int n,s;
int A[SZ];
ll dp[3050][3050];
int main()
{
scanf("%d%d",&n,&s);
for(int i = 1;i <= n;i ++) scanf("%d",&A[i]);
dp[0][0] = 1;
for(int i = 1;i <= n;i ++)
for(int j = 0;j <= s;j ++)
{
dp[i][j] = (dp[i - 1][j] * 2) % MOD ;
if(j >= A[i]) dp[i][j] = ( dp[i][j] + dp[i - 1][j - A[i]] ) % MOD;
}
printf("%lld",dp[n][s]);
return 0;
}
2020.6.1