Bigger系列题解

Bigger Python

坑点在于要高精度以及表达式求值,用java写可以很容易避免高精度问题

然后这道题就可以AC了

代码

import java.io.*;
import java.util.*;
import java.math.*;
import java.text.*; public class Main
{
static Map<String,BigInteger> map= new HashMap<String,BigInteger>();
static BigInteger cal(String s)
{
BigInteger ans=BigInteger.ZERO,mu=BigInteger.ONE,tk,val;
int tem,len=s.length(),la=1;
for(int pos=0;pos<len;pos++)
{
if(s.charAt(pos)=='(')
{
int k=1;
tk=BigInteger.ZERO;
for(int d=pos+1;d<len;d++)
if(s.charAt(d)=='(')
k++;
else if(s.charAt(d)==')')
{
k--;
if(k==0)
{
tk=cal(s.substring(pos+1,d));
pos=d+1;
break;
}
}
}
else if(s.charAt(pos)=='-'||(s.charAt(pos)>='0'&&s.charAt(pos)<='9'))
{
int flag=1;
if(s.charAt(pos)=='-'){flag=-1;pos++;}
tem=0;
while(pos<len&&s.charAt(pos)>='0'&&s.charAt(pos)<='9')
{
tem=tem*10+(s.charAt(pos)-'0');
pos++;
}
tk=BigInteger.valueOf(tem*flag);
}
else
{
int fla=pos;
while(pos<len&&((s.charAt(pos)>='a'&&s.charAt(pos)<='z')||(s.charAt(pos)>='A'&&s.charAt(pos)<='Z')))pos++;
tk=map.get(s.substring(fla,pos));
}
if(pos==len)
{
mu=mu.multiply(tk);
if(la==1)
ans=ans.add(mu);
else
ans=ans.subtract(mu);
return ans;
}
if(s.charAt(pos)=='+'||s.charAt(pos)=='-')
{
mu=mu.multiply(tk);
if(la==1)
ans=ans.add(mu);
else
ans=ans.subtract(mu);
mu=BigInteger.ONE;
if(s.charAt(pos)=='+')
la=1;
else
la=0;
}
else if(s.charAt(pos)=='*')
mu=mu.multiply(tk);
}
return ans;
}
static void pr(String s)
{
int pos,la=0,len=s.length();
for(pos=0;pos<len;pos++)
{
if(s.charAt(pos)==',')
{
System.out.print(map.get(s.substring(la,pos)).toString()+" ");
la=pos+1;
}
}
System.out.println(map.get(s.substring(la,pos)).toString());
}
public static void main(String args[]) throws Exception
{
//Scanner in = new Scanner(new File("in.txt"));
//PrintWriter out = new PrintWriter(new FileWriter("out.txt",true)); Scanner in = new Scanner(System.in);
String s,tem;
char c;
int len;
int pos;
map.clear();
while(in.hasNext())
{
s=in.nextLine();
tem="";
len=s.length();
if(s.charAt(0)=='p')
pr(s.substring(6, len-1));
else
{
for(pos=0;pos<len;pos++)
if(s.charAt(pos)=='=')
{
map.put(s.substring(0,pos),cal(s.substring(pos+1, len)));
}
}
}
//System.out.println(h[n][m].mod(e));
System.out.close(); }
};

Bigger place

题源:ZOJ Monthly, December 2013 Problem H. Tragedy Organ

代码:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <iostream>
using namespace std; int main() {
double x, e ,y;
int t;
scanf("%d",&t);
while(t--)
{
cin>>x>>y;
x = x / y * 25.0;
x = sqrt(x * 0.04);
e = 1 + 8.0 / sqrt(7.0) * sqrt(x) * sin(sqrt(7.0) / 2 * log(x));
printf("%.12f\n", e);
}
return 0;
}

Bigger world

题目转化为{1,1,2,2,3,3,4,4,n,n}这个序列中,两个相同的数不挨在一起的方案数

用容斥什么的很容易就可以推出来公式了,然后显然不可以过,因为这道题的模数是一个非素数,所以得智障改一改公式,优化一下才行。

结果貌似大家都是on 递推的…

a(n) = n*(2*n-1)*a(n-1) + (n-1)*n*a(n-2)

代码

#include<bits/stdc++.h>
using namespace std; long long dp[100100]; int main(){
int n,p;
while(scanf("%d%d",&n,&p)!=EOF){
n--;
dp[2]=2%p;
for(int i=3;i<=n;i++){
dp[i]=1LL*i*(2*i-1)%p*dp[i-1]%p+1LL*(i-1)*i%p*dp[i-2]%p;
dp[i]%=p;
}
printf("%lld\n",dp[n]);
}
return 0;
}

Bigger bet

随便推一推,发现这道题就是求行列式值,因为题目其实就是把行列式的定义说了一遍

然后这个怎么做呢?

定义消元后的f(i)=A[i][i]

很轻松就可以发现:f(n) = n^k - sigma(d|n)f(d),d<n,移项后 n^k = sigma(d|n)f(d)

f(i)显然是一个积性函数,f(p^a) = (pk)(a-1)(p^k-1),p是素数

然后线性筛就可以把f莽出来,这道题就结束了。

当然,这道题你得预处理+记忆化一些东西去优化常数。

代码

#include <cstdio>
#include <cstring> const int MAXN = 1000000 + 10;
const int MOD = 1e9+7; int vis[MAXN], A[MAXN];
int f[MAXN], p[MAXN], T, N, M, K, cas; int pow_mod(int a, int n) {
int ret = 1;
for (; n; n >>= 1) {
if (n & 1) ret = (long long)ret * a % MOD;
a = (long long)a * a % MOD;
}
return ret;
} void sieve() {
M = 0;
for (int i = 2; i < MAXN; ++ i) {
if (!vis[i]) p[M ++] = i;
for (int j = 0; j < M && i * p[j] < MAXN; ++ j) {
vis[i * p[j]] = true;
if (i % p[j] == 0) break;
}
}
} int main() {
sieve();
scanf("%d", &T);
for (cas = 1; cas <= T; ++ cas) {
scanf("%d%d", &N, &K);
K %= (MOD - 1);
memset(f, 0, sizeof(int) * (N + 1)); f[1] = 1;
for (int i = 2; i <= N; ++ i) {
if (!f[i]) {
A[i] = pow_mod(i, K), f[i] = A[i] - 1;
if (f[i] < 0) f[i] += MOD;
}
for (int j = 0, t; j < M && (t = i * p[j]) <= N; ++ j) {
if (i % p[j] == 0) {
f[t] = (long long)f[i] * A[p[j]] % MOD;
break;
}
else {
f[t] = (long long)f[i] * (A[p[j]] - 1 + MOD) % MOD;
}
}
}
int ret = 1;
for (int i = 1; i <= N; ++ i) ret = (long long)ret * f[i] % MOD;
printf("%d\n", ret);
}
return 0;
}

IEEE Bigger系列题解的更多相关文章

  1. QTREE系列题解

    打了快一星期的qtree终于打完了- - (其实还有两题改不出来弃疗了QAQ) orz神AK一星期前就虐完QTREE 避免忘记还是简单写下题解吧0 0 QTREE1 题意: 给出一颗带边权树 一个操作 ...

  2. 2018 IEEE极限编程大赛 题解

    去年742,今年72,也算一种小小的进步. 明年前30(笑 1. Drawing Rooted Binary Trees 给定一个树的中序和前序的遍历,要求输出这棵树(包括空格的) #include ...

  3. 【题解】NOI 系列题解总集

    每次做一道 NOI 系列的估计都很激动吧,对于我这种萌新来说( P1731 [NOI1999]生日蛋糕 练习剪枝技巧,关于剪枝,欢迎看我的垃圾无意义笔记 这道题是有一定难度的,需要运用各种高科技剪枝( ...

  4. SPOJ_QTREE系列题解

    QTREE4 #pragma comment(linker, "/STACK:102400000,102400000") //#include<bits/stdc++.h&g ...

  5. GSS 系列题解

    GSS GSS1 随便猫树或者线段树,就可以过了 猫树不说,线段树可以维护左边最大,右边最大,区间最大,区间值然后就做出来了. //Isaunoya #pragma GCC optimize(2) # ...

  6. GSS系列题解——最大子段和系列

    开坑啦! 2019 3/28 以前一直不知道怎么搞最大子段和,如今终于可以学习,其实真的很简单啊. 2019 3/29 树链剖分上最大子段和也OK啦 前置技能:线段树 题目大意:询问区间[l,r]的最 ...

  7. Linux实现的IEEE 802.q VLAN

    本文转载自: http://blog.chinaunix.net/uid-20786208-id-4291059.html Technorati 标签: Linux VLAN   ---------- ...

  8. IEEE 802

    IEEE 802又称为LMSC(LAN /MAN Standards Committee, 局域网/城域网标准委员会), 致力于研究局域网和城域网的物理层和MAC层中定义的服务和协议, 对应OSI网络 ...

  9. Ethernet & IEEE 802.3 802.X 802.1ag-MEP

    ISO/IEC 7498标准,它定义了网络互联的7层框架,也就是开放式系统互连参考模型(OSI模型). 交换机好比是邻近的街道,而路由器则是街道的交汇点. (交换机第二层,即数据链路层,也有四层,七层 ...

随机推荐

  1. delphi TComponent类 2

    来自:http://blog.csdn.net/lailai186/article/details/7442385 ------------------------------------------ ...

  2. Linux学习笔记:cp和scp复制文件

    拷贝文件和文件夹,在Linux上通过cp命令来实现. cp:用户当前机器的文件复制 scp:通过ssh本机和其他机器的文件复制 secure copy cp a.txt b.txt scp a.txt ...

  3. vector 测试

    vector 测试 */--> div.org-src-container { font-size: 85%; font-family: monospace; } pre.src { backg ...

  4. mysql索引(btree索引和hash索引的区别)

    所有MySQL列类型可以被索引.根据存储引擎定义每个表的最大索引数和最大索引长度.所有存储引擎支持每个表至少16个索引,总索引长度至少为256字节.大多数存储引擎有更高的限制. 索引的存储类型目前只有 ...

  5. 程序设计实习MOOC / 程序设计与算法(一)第二周测验(2018春季)

    编程题: 1:对齐输出 总时间限制:  1000ms 内存限制:  65536kB 描述 读入三个整数,按每个整数占8个字符的宽度,右对齐输出它们. 输入 只有一行,包含三个整数,整数之间以一个空格分 ...

  6. tocmat远程调试

    有时候使用tomcat进行远程调试,下面贴出远程调试用的startup.bat脚本 rem Licensed to the Apache Software Foundation (ASF) under ...

  7. USACO 4.4 Shuttle Puzzle

    Shuttle PuzzleTraditional The Shuttle Puzzle of size 3 consists of 3 white marbles, 3 black marbles, ...

  8. Django实战(9):实现Product的输入校验

    让我们完成上一节中的任务: 1.验证price>0:需要在Form中验证: 2. 验证title唯一:在Model中验证: 3. 验证image_url的扩展名:在Form中验证,还可以顺便在M ...

  9. 002 python语法入门

    一:基本数据类型知识点 1.基本数据类型 Number 数字 String 字符串 Bool 布尔 List 列表 Tuple 元组 Set 集合 Dictionary字典 2.分类 )标准的pyth ...

  10. hdoj2955 Robberies(01背包)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2955 题意 有n家银行,每家银行有两个属性:钱数m,概率p,p表示抢这家银行被逮着的概率.有一个人想抢 ...