2017 ACM-ICPC 亚洲区(西安赛区)网络赛

  •  A. Tree 题库链接

    • 通过率: 41.8 %
    • 通过人数: 51
  •  B. Coin 题库链接(√)

    就是求 ((p-q)/p+q/p*x)^k 的偶次项系数之和

    代入 x=1, -1 加加减减就行了

    • 通过率: 73.25 %
    • 通过人数: 734
  •  C. Sum 题库链接(√)(

    1000000100000010000001000001
    这样,放233个1就好了

    C = "1000000" * 233

    • 通过率: 91.44 %
    • 通过人数: 1121
  •  D. Brain-baffling Game 题库链接
    • 通过率: 4.55 %
    • 通过人数: 1
  •  E. Maximum Flow 题库链接(√)

    E 得知道最大流等于最小割
    然后 0 到 n-1 肯定要割
    其他点和 0 以及 n-1 都有边肯定要割一条
    然后发现最高位是 1 的割和 n-1 连的,否则割和 0 连的
    然后发现这已经割好了 //

    其实也觉得E恐怕是一个数位dp,但是还是打表

    做差,差为4的整数幂+1
    每个数的出现有周期
    除了最开始的两次
    但是那两次同样有规律

    lowbit找规律

    规律看两两之间的差
    4^n+3出现的规律就是把一个数的二进制表示的情况下通过删除或插入或替代的方法从n到n+1的次数

    • 通过率: 62.16 %
    • 通过人数: 391
  •  F. Trig Function 题库链接(√)
  • (chebyshev+切比雪夫多项式

    求出k然后比较分子分母大小然后从小的开始+=2算出双阶层就好了

    • 通过率: 74.08 %
    • 通过人数: 463
  •  G. Xor 题库链接 (hdu5840 分块,K大于sqrtn的暴力跳,小于sqrtn的预处理跳到根的值

    k 大暴力跳
    k 小就预处理一下加加减减

    • 通过率: 56.87 %
    • 通过人数: 149
  •  H. Music 题库链接
    • 通过率: 36.36 %
    • 通过人数: 4
  •  I. Barty‘s Computer 题库链接(裸AC自动机,

    前一半就是多校解法,匹配到之后hash判断砍一半扔进ac自动机,flag标记后半串,然后查询的时候,1和2 用ac自动机匹配,匹配到了用hash比3 4

    I 转化成五维偏序然后 bitset 裸的五维数点

    转五维数点直接 sort + lower_bound 就行了

    暴力匹配 匹配X4

    • 通过率: 65.58 %
    • 通过人数: 101
  •  J. Easy Problem 题库链接
    • 通过率: 40 %

BCEF

C:

#include<cstdio>
#include<iostream>
#include<cstring>

using namespace std;

int main()
{
    int t,x;
    scanf("%d",&t);
    while(t--){
        cin>>x;
        printf("1");
        for(int i=2;i<=233;i++)
        {
            printf("0000001");
        }
        printf("\n");
    }
    return 0;
}

规律

B:

#include <iostream>
#include <cstdio>
using namespace std;
int mod=1e9+7;
typedef long long ll;

long long exgcd(long long a,long long b,long long &x,long long &y)
{
    if(a==0&&b==0) return -1;//无最大公约数
    if(b==0){x=1;y=0;return a;}
    long long d=exgcd(b,a%b,y,x);
    y-=a/b*x;
    return d;
}

long long inv(long long a,long long n)
{
    long long x,y;
    long long d=exgcd(a,n,x,y);
    if(d==1) return (x%n+n)%n;
    else return -1;
}

ll pow(int x,int n)  //注意n等于0的时候
{
    ll a=x;
    ll ans=1;
    while (n)
    {
        if (n&1) ans=ans*a%mod;
        a=a*a%mod;
        n>>=1;//效果跟n/=2;一样
    }
    return ans;
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        ll p,q,k;
        ll x,y;
        scanf("%lld%lld%lld",&p,&q,&k);
        if(p>q)
        {
            swap(q,p);
        }
        x=pow(q-2*p,k);
        y=pow(q,k);
        x=(x+y)%mod;
        y=(2*y)%mod;

        printf("%lld\n",(x*inv(y,mod))%mod);
    }
}

1

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
const int mod = 1e9+7;
long long _pow(long long a,long long b)
{
    long long res = 1;
    while(b)
    {
        if(b&1)
            res = res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
long long exgcd(long long a,long long b,long long &x,long long &y)
{
    if(a==0&&b==0) return -1;//无最大公约数
    if(b==0){x=1;y=0;return a;}
    long long d=exgcd(b,a%b,y,x);
    y-=a/b*x;
    return d;
}

long long inv(long long a,long long n)
{
    long long x,y;
    long long d=exgcd(a,n,x,y);
    if(d==1) return (x%n+n)%n;
    else return -1;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int p,q,k;
        scanf("%d%d%d",&p,&q,&k);
        if(p>q){
            int temp=p;
            p=q;
            q=temp;
        }
        long long x=_pow(q-2*p,k);
        long long y=_pow(q,k);
        x=y+x;
        y=2*y;
        printf("%lld\n",x*inv(y,mod)%mod);
    }
    return 0;
}

2

E:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1000000007;
ll sum[100];
ll la[100];
ll two[100];
int main()
{
    sum[0]=1;
    la[0]=1;
    two[0]=1;
    for(int i=1; i<=64; i++)
    {
        two[i]=two[i-1]*2ll;
        sum[i]=(sum[i-1]*2%mod+la[i-1]*3%mod)%mod;
        la[i]=la[i-1]*4%mod;
    }
    ll n;
    while(~scanf("%lld",&n))
    {

        n--;
        ll pos;
        for(ll i=62; i>=0; i--)
        {
            if(n>=two[i])
            {
                pos=i;
                break;
            }
        }
        ll ans=n%mod;
//        cout<<pos<<endl;
        pos=(1ll<<pos);
        n-=pos;
        ans+=((1ll*pos/2ll)%mod)*((pos-1ll)%mod);
        ans%=mod;
        for(ll i=0; i<63; i++)
        {
            if(n&(1ll<<i))
                ans+=sum[i];
            ans%=mod;
        }
        printf("%lld\n",ans%mod);
    }
}

1

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;

const int MAXN = 30010;

string lib[MAXN];
int tot;

int cmpa(string &str, string &a){
    for(int i = 0; i < a.length(); ++i){
        if(str[i] != a[i]){
            return 0;
        }
    }
    return 1;
}

int cmpd(string &str, string &d){
    for(int i = 1; i <= d.length(); ++i){
        if(str[str.length() - i] != d[d.length() - i]){
            return 0;
        }
    }
    return 1;
}

int cmpbc(string &str, string &b, string &c){
    int mid = str.length() / 2;
    for(int i = 0; i < c.length(); ++i){
        if(str[mid + i] != c[i]){
            return 0;
        }
    }
    for(int i = 1; i <= b.length(); ++i){
        if(str[mid - i] != b[b.length() - i]){
            return 0;
        }
    }
    return 1;
}

int main(){
    ios::sync_with_stdio(false);
    int T, q;
    for(cin >> T; T && cin >> q; --T){
        tot = 0;
        int ctrl;
        for (int k = 0; k < q; ++k)
        {
            cin >> ctrl;
            if (ctrl == 1)
            {
                cin >> lib[tot++];
            }
            else
            {
                string a, b, c, d;
                cin >> a >> b >> c >> d;
                int maxLen = a.length() + b.length();
                if (c.length() + d.length() > maxLen)
                    maxLen = c.length() + d.length();
                maxLen *= 2;
                int cnt = 0;
                for (int i = 0; i < tot; ++i)
                {
                    if (lib[i].length() >= maxLen && lib[i].length() % 2 == 0)
                    {
                        if (cmpa(lib[i], a) && cmpd(lib[i], d) && cmpbc(lib[i], b, c))
                        {
                            ++cnt;
                        }
                    }
                }
                cout << cnt << endl;
            }
        }
    }
    return 0;
}

2

F:【分析】:

http://www.docin.com/p-385138324.html?qq-pf-to=pcqq.group加个费马小定理 乘逆元就可以了

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cstdlib>
#include<sstream>
#include<fstream>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<cmath>
#include<utility>
#include<numeric>
#include<iterator>
#include<algorithm>
#include<functional>
#include<ctime>
#include<cassert>
using std::cin;
using std::cout;
using std::endl;
typedef long long ll;
typedef unsigned long long ull;
typedef std::pair<int,int> P;
#define FOR(i,init,len) for(int i=(init);i<(len);++i)
#define For(i,init,len) for(int i=(init);i<=(len);++i)
#define fi first
#define se second
#define pb push_back
#define is insert
namespace IO {
    inline char getchar() {
        static const int BUFSIZE=5201314;
        static char buf[BUFSIZE],*begin,*end;
        if(begin==end) {
            begin=buf;
            end=buf+fread(buf,1,BUFSIZE,stdin);
            if(begin==end) return -1;
        }
        return *begin++;
    }
}
inline void read(int &in) {
    int c,symbol=1;
    while(isspace(c=IO::getchar()));
    if(c==‘-‘) { in=0;symbol=-1; }
    else in=c-‘0‘;
    while(isdigit(c=IO::getchar())) { in*=10;in+=c-‘0‘; }
    in*=symbol;
}
inline int read() { static int x;read(x);return x; }
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a; }
ll lcm(ll a,ll b) { return a/gcd(a,b)*b; }

const ll mod=998244353LL;
const int maxm=1e4+10;
ll qpow(ll a,ll b) {
    ll ans=1;
    while(b) {
        if(b&1) ans=ans*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ans;
}
ll f[maxm],invf[maxm];
ll n,m;

int main() {
#ifdef MengLan
    int Beginning=clock();
    //freopen("in","r",stdin);
    //freopen("out","w",stdout);
#endif // MengLan

    f[0]=1;
    FOR(i,1,maxm) f[i]=f[i-1]*i%mod;
    invf[maxm-1]=qpow(f[maxm-1],mod-2);
    for(int i=maxm-2;i>=0;--i) invf[i]=invf[i+1]*(i+1)%mod;
    while(cin>>n>>m) {
        if((n&1)^(m&1)) { puts("0");continue; }
        if(m>n) { puts("0");continue; }
        if(m==0) { puts("998244352");continue; }
        ll ans=1;
        for(ll i=n-m+2;i<=n+m-2;i+=2) { ans*=i;ans%=mod; }
        ans=ans*n%mod;
        ll k=1;
        For(i,1,m) { k=k*i%mod; }
        ll x=qpow(k,mod-2);
        ans=ans*x%mod;
        if(((n-m)/2)&1) ans=(mod-ans)%mod;
        cout<<ans<<endl;
    }

#ifdef MengLan
    printf("Time: %d\n",clock()-Beginning);
#endif // MengLan
    return 0;
}

1

时间: 2024-10-31 17:34:54

2017 ACM-ICPC 亚洲区(西安赛区)网络赛的相关文章

2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)

摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5984 Pocky 题意 给出一根棒子(可以吃的)的长度x和切割过程中不能小于的长度d,每次随机的选取一个位置切开,吃掉左边的一半,对右边的棒子同样操作,直至剩余的长度不大于d时停止.现在给出x和d,问切割次数的数学期望是多少. 解题思路 当看到第二个样例2 1时,结果是1.693147,联想到ln

2014ACM/ICPC亚洲区鞍山赛区现场赛——题目重现

2014ACM/ICPC亚洲区鞍山赛区现场赛--题目重现 题目链接 5小时内就搞了5题B.C.D.E,I. H题想到要打表搞了,可惜时间不够,后面打出表试了几下过了- - K题过的人也比较多,感觉是个几何旋转+ploya,但是几何实在不行没什么想法 B:这题就是一个大模拟,直接数组去模拟即可,注意细节就能过 C:类似大白上一题红蓝三角形的, 每个数字找一个互质和一个不互质个数,除掉重复就直接除2,然后总的C(n, 3)减去即可,问题在怎么处理一个数字互质和不互质的,其实只要处理出不互质的即可,这

ICPC 2018 徐州赛区网络赛

ACM-ICPC 2018 徐州赛区网络赛 ?去年博客记录过这场比赛经历:该死的水题 ?一年过去了,不被水题卡了,但难题也没多做几道.水平微微有点长进. ? ? D. Easy Math 题意: ? 给定 \(n\), \(m\) ,求 \(\sum _{i=1}^{m} \mu(in)\) .其中 $ 1 \le n \le 1e12$ , $ 1 \le m \le 2e9$ ,\(\mu(n)\) 为莫比乌斯函数. ? 思路: ? 容易知道,\(i\) 与 \(n\) 不互质时, \(\m

2017 ACM/ICPC(西安)赛后总结

早上8:00的高铁,所以不得不6点前起床,向火车站赶……到达西安后已经是中午,西工大距离西安北站大概3小时车程的距离,只好先解决午饭再赶路了……下午3.30的热身赛,一行人在3.35左右赶到了赛场,坐下后立即开始读题,A题快速幂很快就通过了,B题是一道非常恶心的大模拟,本蒟蒻手敲近两小时wa的生活不能自理,终于在终场前发现一个小bug但是没有提交蛮遗憾(自信AC,捂脸逃~).晚上,回到酒店后,很早就睡觉了,并不像第一次参加区域赛那样紧张的很晚才入睡. 第二天的正式赛开始后,我和队友分别从前中后三

2016 ACM/ICPC亚洲区大连站-重现赛 解题报告

任意门:http://acm.hdu.edu.cn/showproblem.php?pid=5979 按AC顺序: I - Convex Time limit    1000 ms Memory limit 65536 kB OS Windows We have a special convex that all points have the same distance to origin point. As you know we can get N segments after linki

2014ACM/ICPC亚洲区鞍山赛区现场赛1009Osu!

鞍山的签到题,求两点之间的距离除以时间的最大值.直接暴力过的. A - Osu! Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 5078 Appoint description:  System Crawler  (2014-10-22) Description Osu! is a very popular music game. B

西安赛区网络赛

1001.Post Robot 字符串模拟题: 1 //============================================================================ 2 // Name : 20140920.cpp 3 // Author : 4 // Version : 5 // Copyright : Your copyright notice 6 // Description : Hello World in C++, Ansi-style 7

2014ACM/ICPC亚洲区西安站现场赛 F color(二项式反演)

题意:小球排成一排,从m种颜色中选取k种颜色给n个球上色,要求相邻的球的颜色不同,求可行的方案数,答案模1e9+7.T组数据,1<= n, m <= 1e9, 1 <= k <= 1e6, k <= n, m 分析: a(k)表示用不超过k种颜色染n个位置,两两相邻颜色不相同的总数,很简单a(k)=k(n-1)^(k-1) b(k)表示恰好用k种颜色 很显然a(k)=ΣC(k,i)b(i),我们知道a,想知道b,这里就用到二项式反演 那么b(k)=ΣC(k,i)*i*(-1)

hdu6206 Apple 2017 ACM/ICPC Asia Regional Qingdao Online

地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6206 题目: Apple Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 530    Accepted Submission(s): 172 Problem Description Apple is Taotao's favouri

hdu5512 Pagodas(2015ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学) )

Pagodas Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 14 Accepted Submission(s): 13 Problem Description n pagodas were standing erect in Hong Jue Si between the Niushou Mountain and the Yuntai M