ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined)

前四题比较水,E我看出是欧拉函数傻逼题,但我傻逼不会,百度了下开始学,最后在加时的时候A掉了

AC:ABCDE Rank:182 Rating:2193+34->2227 终于橙了,不知道能待几天

A.A Serial Killer

题目大意:一开始给你两个字符串,每次给你当前两个串中的一个和一个新的串,用新的串换掉旧的,每次输出当前的串。(次数<=1000)

思路:二逼题

#include<iostream>
using namespace std;
int main()
{
    string a,b,c,d;int n;
    cin>>a>>b>>n;
    cout<<a<<‘ ‘<<b<<endl;
    while(n--)
    {
        cin>>c>>d;
        if(a==c)a=d;else b=d;
        cout<<a<<‘ ‘<<b<<endl;
    }
}

B.Sherlock and his girlfriend

题目大意:给2~n+1染色,要求任意2~n+1中的数,它的质因数(自己除外)和它颜色不同,求最小染色数和方案。(n<=100,000)

思路:质数染成一种,合数染成另一种,特判n<3的情况。

#include<cstdio>
#define MN 100000
int f[MN+5];
int main()
{
    int n,i,j;
    scanf("%d",&n);++n;
    for(i=2;i*i<=n;++i)if(!f[i])
        for(j=i*i;j<=n;j+=i)f[j]=1;
    puts(n<4?"1":"2");
    for(i=2;i<=n;++i)printf("%d ",f[i]+1);
}

C.Molly‘s Chemicals

题目大意:给定长度为n的数字序列和一个数k,求序列中有多少子串和为k的次幂。(n<=100,000,1<=|k|<=10)

思路:先预处理出可能用上的k的次幂(要特殊考虑k为±1),把数列前缀和,对于每个si枚举一个k的次幂,求出有多少个j<i满足si-sj=k的次幂,可以用map维护,复杂度O(nlog^2)。

#include<cstdio>
#include<iostream>
#include<map>
#define ll long long
using namespace std;
char B[1<<26],*S=B,C;int X,F;
inline int read()
{
    for(F=1;(C=*S++)<‘0‘||C>‘9‘;)if(C==‘-‘)F=-1;
    for(X=C-‘0‘;(C=*S++)>=‘0‘&&C<=‘9‘;)X=(X<<3)+(X<<1)+C-‘0‘;
    return X*F;
}
#define INF 100000000000000LL
map<ll,int> mp;
ll p[50];int pn;
int main()
{
    fread(B,1,1<<26,stdin);
    int n,k,i,j;ll x,ans=0;
    n=read();k=read();
    for(x=1;x>=-INF&&x<=INF&&!mp[x];x*=k)p[++pn]=x,mp[x]=1;
    mp.clear();
    for(i=x=0;i<n;++i)
    {
        ++mp[x];x+=read();
        for(j=1;j<=pn;++j)ans+=mp[x-p[j]];
    }
    cout<<ans;
}

D.The Door Problem

题目大意:N个门,门有初始状态(0/1),M个开关,每个开关可以一次性改变若干的门的开关状态,保证每个门恰被两个开关控制,求是否可能同时打开所有门。(N,M<=100,000)

思路:2-SAT裸题,每个门给对应的两个开关加上一个异或的限制关系,也可以并查集、DFS之类的,总之很水。

#include<cstdio>
char B[1<<26],*S=B,C;int X;
inline int read()
{
    while((C=*S++)<‘0‘||C>‘9‘);
    for(X=C-‘0‘;(C=*S++)>=‘0‘&&C<=‘9‘;)X=(X<<3)+(X<<1)+C-‘0‘;
    return X;
}
#define MN 100000
#define MV 200000
struct edge{int nx,t;}e[MV*2+5];
int r[MN+5],a[MN+5],b[MN+5];
int h[MV+5],en,l[MV+5],d[MV+5],cnt,z[MV+5],zn,inz[MV+5],f[MV+5],fn;
inline void ins(int x,int y)
{
    e[++en]=(edge){h[x],y};h[x]=en;
    e[++en]=(edge){h[y],x};h[y]=en;
}
void tj(int x)
{
    l[x]=d[x]=++cnt;inz[z[zn++]=x]=1;
    for(int i=h[x];i;i=e[i].nx)
    {
        if(!d[e[i].t])tj(e[i].t);
        if(inz[e[i].t]&&l[e[i].t]<l[x])l[x]=l[e[i].t];
    }
    if(l[x]==d[x])for(++fn;z[zn]!=x;inz[z[zn]]=0)f[z[--zn]]=fn;
}
int main()
{
    fread(B,1,1<<26,stdin);
    int n,m,i,j,k;
    n=read();m=read();
    for(i=1;i<=n;++i)r[i]=read();
    for(i=1;i<=m;++i)for(j=read();j--;)(a[k=read()]?b[k]:a[k])=i;
    for(i=1;i<=n;++i)
        if(r[i])ins(a[i],b[i]),ins(a[i]+m,b[i]+m);
        else ins(a[i],b[i]+m),ins(a[i]+m,b[i]);
    for(i=1;i<=m<<1;++i)if(!d[i])tj(i);
    for(i=1;i<=m;++i)if(f[i]==f[i+m])return puts("NO"),0;
    puts("YES");
}

E.The Holmes Children

题目大意:定义f(1)=1,f(n),n>1的值为满足x+y=n且gcd(x,y)=1的(x,y)个数;定义g(n)=Σd|n f(n/d);定义Fk(n)满足k=1时Fk(n)=f(g(n)),k>1且k mod 2=0时Fk(n)=g(Fk-1(n)),k>1且k mod 2=1时Fk(n)=f(Fk-1(n)) 。给出n,k,求Fk(n)mod 1000000007。(1<=n,k<=10^12)

思路:f(n)等同于求满足gcd(x,n-x)=1的x的个数,又因为gcd(x,n-x)=gcd(x,n),所以f(n)就是phi(n)。通过观察发现g(n)=n,所以Fk(n)就是对n做(k+1)/2遍phi。每次n^0.5暴力,n=1时停止就可以了,因为n>2时,phi(n)必为偶数,偶数的phi又必然减少一半,所以复杂度大约是O(n^0.5*logn)。

#include<iostream>
using namespace std;
#define ll long long
#define MX 1000000
ll f[MX+5];
ll F(ll x)
{
    if(x<=MX)return f[x];
    ll i,r=x;
    for(i=2;i*i<=x;++i)if(x%i==0)
    {
        r=r/i*(i-1);
        while(x%i==0)x/=i;
    }
    return x>1?r/x*(x-1):r;
}
int main()
{
    ll n,k,i,j;
    cin>>n>>k;k=k+1>>1;
    for(i=1;i<=MX;++i)f[i]=i;
    for(i=2;i<=MX;i+=2)f[i]>>=1;
    for(i=3;i<=MX;i+=2)if(f[i]==i)
        for(j=i;j<=MX;j+=i)f[j]=f[j]/i*(i-1);
    while(n>1&&k--)n=F(n);
    cout<<n%1000000007;
}
时间: 2024-10-05 06:55:40

ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined)的相关文章

ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined) A

Our beloved detective, Sherlock is currently trying to catch a serial killer who kills a person each day. Using his powers of deduction, he came to know that the killer has a strategy for selecting his next victim. The killer starts with two potentia

ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined) D

Moriarty has trapped n people in n distinct rooms in a hotel. Some rooms are locked, others are unlocked. But, there is a condition that the people in the hotel can only escape when all the doors are unlocked at the same time. There are m switches. E

ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined) C

Molly Hooper has n different kinds of chemicals arranged in a line. Each of the chemicals has an affection value, The i-th of them has affection value ai. Molly wants Sherlock to fall in love with her. She intends to do this by mixing a contiguous se

【ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined) C】 Permutation Cycle

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] p[i] = p[p[i]]一直进行下去 在1..n的排列下肯定会回到原位置的. 即最后会形成若干个环. g[i]显然等于那个环的大小. 即让你形成若干个环. 每个环的大小只能为A或B 则相当于问Ax+By=n是否有解. 可以枚举x然后看看n-A*x能否被B整除. 构造x个长度为A的环,y个长度为B的环就好了 [代码] #include <bits/stdc++.h> using namespace std; const in

【ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined) B】Recursive Queries

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 写个记忆化搜索. 接近O(n)的复杂度吧 [代码] #include <bits/stdc++.h> using namespace std; const int N = 1e6; int g[N+10]; int pre[N+10][20]; int f(int x){ int temp = 1; while (x){ if (x%10!=0) temp*=(x%10); x/=10; } return temp; } in

【ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined) A】 Palindromic Supersequence

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 字符串倒着加到原串右边就好 [代码] #include <bits/stdc++.h> using namespace std; int main(){ #ifdef LOCAL_DEFINE freopen("rush_in.txt", "r", stdin); #endif ios::sync_with_stdio(0),cin.tie(0); string s; cin >&

【ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined) D】Tree

[链接] 我是链接,点我呀:) [题意] 让你在树上找一个序列. 这个序列中a[1]=R 然后a[2],a[3]..a[d]它们满足a[2]是a[1]的祖先,a[3]是a[2]的祖先... 且w[a[1]]<=w[a[2]]<=w[a[3]].... 且要求这个序列的长度最长 (且a[1]和a[2]的简单路径之间不能有大于等于a[1]的点 (也就是能取就取 [题解] 考虑一个naive的思路. 定义一个next[i]数组,表示i往上最近的权值大于i的节点所在的位置. 则我们每次输入2 R X的

ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined)

占坑,明天写,想把D补出来一起写. 原文地址:https://www.cnblogs.com/ZERO-/p/8455990.html

ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined) ---d

D. Tree 最暴力的想法自然是,对于每一次询问,沿着父亲一点一点往上跳模拟.这样似乎并不能优化... 稍微好一点的想法是对于每一个点开一个nxt数组表示父亲中权值大于他的里面离他最近的在哪里,同样对于每一次询问模拟往上跳,每次加点模拟往上找,复杂度依旧没有变化,但为我们提供了一个思路,我们可以倍增啊! 首先我们对于2操作,我们记录sum[x][i]表示他的2^i个nxt的值的和是多少,这样我们就可以快速求出在总权值小于x的前提下最多能跳到哪里. 考虑如何求出这个数组. 定义nxt[x][i]