第十七回
後期第五回
担当:zeke
(去年のスライド抜粋)
辺りの日程でできそう?(たぶん)
1/15はセンター前日だったりする
はいやるだけ
int main() {
while(1){
int n;
cin>>n;
if(n==0){
break;
}
V vec(n);
rep(i,n)cin>>vec[i];
ll cnt=0;
rep(i,n-3){
if(vec[i]==2&&vec[i+1]==0&&vec[i+2]==2&&vec[i+3]==0){
cnt++;
}
}
cout<<cnt<<endl;
}
}int main() {
while(1){
ll m,n,p;
cin>>m>>n>>p;
p--;
if(!m){
break;
}
V vec(m);
vec[p]++;
rep(i,n){
ll x,y;
cin>>x>>y;
x--;y--;
if(vec[x]|vec[y]){
vec[x]=1;
vec[y]=1;
}
}
ll res=0;
rep(i,m){
res+=vec[i];
}
cout<<res<<endl;
}
}
int main() {
cin.tie(0);
ios::sync_with_stdio(false);
cout << fixed << setprecision(10);
ll index=0;
while (1) {
cerr<<index<<endl;
index++;
ll n;
ll res = INF;
cin >> n;
if (n == 0) {
break;
}
ll n_temp = n;
vector<ll> yakusuu;
yakusuu.push_back(1);
ll Wmax=sqrt(n);
rep3(i, 2,Wmax+1000) {
if (n % i == 0) {
yakusuu.push_back(i);
}
}
ll limit=pow(n,1/3)+100;
cerr<<yakusuu.size()<<endl;
for (auto i : yakusuu) {
ll n_2 = n / i;
for(auto j:yakusuu){
if(n_2%j==0){
chmin(res,i+j+(n_2/j));
}
}
}
cout << res << endl;
}
}
例1:PCIの順番つまりC=0,I=1,P=-1の時、
max(min(1,0),min(-1,0))=0
max(-1,0)=0
となり両方0になるのでうまくいくパターンだと分かる
// C++ は素で書く?
/*
Author:zeke
pass System Test!
GET AC!!
*/
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using ll = long long;
using ld = long double;
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define all(x) (x).begin(), (x).end()
#define rep3(var, min, max) for (ll(var) = (min); (var) < (max); ++(var))
#define repi3(var, min, max) for (ll(var) = (max)-1; (var) + 1 > (min); --(var))
#define Mp(a, b) make_pair((a), (b))
#define F first
#define S second
#define Icin(s) \
ll(s); \
cin >> (s);
#define Scin(s) \
ll(s); \
cin >> (s);
template <class T>
bool chmax(T& a, const T& b) {
if (a < b) {
a = b;
return 1;
}
return 0;
}
template <class T>
bool chmin(T& a, const T& b) {
if (b < a) {
a = b;
return 1;
}
return 0;
}
typedef pair<ll, ll> P;
typedef vector<ll> V;
typedef vector<V> VV;
typedef vector<P> VP;
ll mod = 1e9 + 7;
ll MOD = 1e9 + 7;
ll INF = 1e18;
#define int ll
// cout << "Case #" << index << " :IMPOSSIBLE";
int modPow(long long a, long long n, long long p) {
if (n == 0) return 1; // 0乗にも対応する場合
if (n == 1) return a % p;
if (n % 2 == 1) return (a * modPow(a, n - 1, p)) % p;
long long t = modPow(a, n / 2, p);
return (t * t) % p;
}
typedef string::const_iterator State;
// powMod(a,b,MOD)
// O(log(b))?
int expression(State& begin);
map<char, ll> mp;
V permu;
void mp_init() {
map<char, ll> temp;
mp = temp;
}
int number(State& begin) {
int res = permu[mp[*begin]];
return res;
}
int factor(State& begin) {
begin++;
int ret = expression(begin);
begin++;
return ret;
}
int expression(State& begin) {
// cout<<"init "<<*begin<<endl;
int ret = 0;
if (*begin - 'A' < 26 && *begin - 'A' >= 0) {
ret = number(begin);
begin++;
}
if (*begin == '(') {
ret = factor(begin);
}
if (*begin == '>') {
begin++;
return max(ret, expression(begin));
}
if (*begin == '<') {
begin++;
return min(ret, expression(begin));
}
return ret;
}
int kaijo(int k) {
ll res = 1;
rep3(i, 1, k + 1) { res *= i; }
return res;
}
signed main() {
while (1) {
ll n;
cin >> n;
if (!n) {
break;
}
mp_init();
string s;
cin >> s;
for (auto i : s) {
mp[i] = mp.size();
}
ll res = 0;
string s1, s2;
cin >> s1 >> s2;
rep(i, n) {
permu = {};
rep(j, n) {
if (j < i) {
permu.push_back(-1);
} else if (i == j) {
permu.push_back(0);
} else {
permu.push_back(1);
}
}
do {
State x1 = s1.begin();
State x2 = s2.begin();
if (!(expression(x1)) && !(expression(x2))) {
for(auto k:permu){
cout<<k<<" ";
}
cout<<endl;
res += kaijo(i) * kaijo(n - i - 1);
}
} while (next_permutation(all(permu)));
}
cout << res << endl;
}
}expr :=<term> | <expr> + <term> | <expr> - <term>
term :=<factor> | <term> * <factor> | <term> / <factor>
factor:=(<expr>) | <number>
number:=[0-9]*
全ての数式はexprの形をとると考える
例:(1+3*5)+(2+(1*5+8)+10)*2
<expr>
<expr>+<term>
<term>+<term>*<factor>
<factor>+<factor>*<number>
(<expr>)+(<expr>)*2
(<expr>+<term>)+(<expr>+<term>)*2
(<term>+<term>*<factor>)+(<expr>+<term>+<factor>)*2
(<factor>+<factor>*<number>)+(<term>+<factor>+<number>)*2
(<number>+<number>*5)+(<factor>+(<expr>)+10)*2
(1+3*5)+(<number>+(<expr>+<term>)+10)*2
(1+3*5)+(<number>+(<term>*<factor>+<number>)+10)*2
(1+3*5)+(2+(<factor>*<number>+8)+10)*2
(1+3*5)+(2+(<number>*5+8)+10)*2
(1+3*5)+(2+(1*5+8)+10)*2
大変だった…
expr:=<term>[+,-<term>]*
term:=<factor>[*,/<factor>]*
factor:=(expr) | number
number:=[0-9]*
階層になっていることが分かる
typedef string::const_iterator State;
int number(State &begin);
int term(State &begin);
int factor(State &begin);
int expr(State &begin);
int number(State &begin){
int ret=0;
while(isdigit(*begin)){
ret*=10;
ret+=(*begin-'0');
begin++;
}
return ret;
}
int term(State &begin){
int ret=factor(begin);
while(1){
if(*begin=='*'|*begin=='/'){
if(*begin=='*'){
begin++;
ret*=factor(begin);
}else{
begin++;
ret/=factor(begin);
}
}else{
break;
}
}
return ret;
}
int factor(State &begin){
if(*begin=='('){
begin++;
int ret=expr(begin);
begin++;
return ret;
}else{
return number(begin);
}
}
int expr(State &begin){
int ret=term(begin);
while(1){
if(*begin=='+'|*begin=='-'){
if(*begin=='+'){
begin++;
ret+=term(begin);
}else{
begin++;
ret-=term(begin);
}
}else{
break;
}
}
return ret;
}
int main() {
cin.tie(0);
ios::sync_with_stdio(false);
cout << fixed << setprecision(10);
string s;
while(cin>>s){
State x=s.begin();
cout<<expr(x)<<endl;
}
}