首页 > 其他分享 >Codeforces Round 869 (Div. 1)

Codeforces Round 869 (Div. 1)

时间:2023-05-01 17:44:07浏览次数:42  
标签:869 系数 return int Codeforces 插值 tag Div getchar

C

根据初中数学知识,恒成立问题考虑未知数x每一项的系数,然后得到(d+1)个等式,根据前两个就可以推出\(s=\frac{b_{d-1}-a_{d-1}}{da_d}\)且\(a_d=b_d\)
但是一直不会用题目给的n个点值求出最高的两项系数(或它们的比值),并且怀疑是否把(d+1)个等式全部用到会更好做,然后两个方向分别搞了半天都没有结果,就下班了。。。
对于题目给点值,只能想到拉格朗日插值,然而并没有发现插值的式子可以暴力转化成和普通式子的系数!直接硬拆就好了,因为只要最高两项系数,很容易分别线性算出。
然后沿着这个思路去算任意项的系数,似乎就可以得到多项式快速插值的算法了!(所以无论是能现场看出插值式子和系数的转化还是学过多项式快速插值都能轻松切掉,无脑+无科技选手被成功区分)
另:怎么还卡scanf啊

点击查看代码
#include <bits/stdc++.h>
using namespace std;
int readfast(){
    int x=0,tag=1; char c=getchar();
    for(;!isdigit(c);c=getchar())if(c=='-')tag=-1;
    for(; isdigit(c);c=getchar())x=x*10+c-48;
    // ungetc(c,stdin);
    return x*tag;
}
const int N=5e6+5,P=1e9+7;
void inc(int& x,int y){
    x+=y;
    if(x>=P) x-=P;
    if(x<0) x+=P;
}
int sum(int x,int y){
    x+=y;
    if(x>=P) x-=P;
    if(x<0) x+=P;
    return x;
}
void mul(int& x,int y){
    x=1ll*x*y%P;
}
int prd(int x,int y){
    return 1ll*x*y%P;
}
inline int fpw(int a,int x){
    int s=1;
    for(;x;x>>=1,a=prd(a,a)) if(x&1) s=prd(s,a);
    return s;
}
int inv[N],s[N];
int cnt1(int n,int* a){
    int ans=0;
    for(int i=0;i<=n;i++){
        int u=prd(s[i],s[n-i]);
        if((n-i)&1) u=P-u;
        inc(ans,prd(u,a[i]));
        //cout<<i<<" "<<u<<" "<<ans<<endl;
    }
    return ans;
}
int cnt(int n){
    int s=n;
    if(n&1) mul(s,(n+1)>>1);
    else s>>=1,mul(s,n+1);
    return s;
}
int cnt2(int n,int* a){
    int ans=0;
    for(int i=0;i<=n;i++){
        int u=prd(s[i],s[n-i]);
        if((n-i)&1) u=P-u;
        int v=sum(cnt(n),P-i);
        v=P-v;
        inc(ans,prd(prd(u,v),a[i]));
    }
    return ans;
}
int d,a[N],b[N];
void work(){
    cin>>d;
    inv[1]=s[0]=s[1]=1;
    for(int i=2;i<=d;++i) {
        inv[i]=prd((P-P/i),inv[P%i]);
        s[i]=prd(s[i-1],inv[i]);
        //cout<<i<<" "<<s[i]<<endl;
    }
    for(int i=0;i<=d;i++) a[i]=readfast();
    for(int i=0;i<=d;i++) b[i]=readfast();
    int k=cnt1(d,a),x=cnt2(d,a),y=cnt2(d,b);
    //cout<<k<<" "<<x<<" "<<y<<endl;
    int ans=prd(sum(y,P-x),prd(inv[d],fpw(k,P-2)));
    cout<<ans<<endl;
}
int main() {
    int T=1; while(T--) work();
    return 0;
}

标签:869,系数,return,int,Codeforces,插值,tag,Div,getchar
From: https://www.cnblogs.com/szsz/p/17366761.html

相关文章

  • Codeforces Gym 103439D - LIS Counting(猜结论+状压)
    一道需要一些猜结论技巧的中档题。首先突破口在于排列长度恰好等于不是额外输入的某个数\(k\)而是LDS与LIS的乘积,这显然启示我们去找一些性质。根据dilworth定理,最长反链等于最小链覆盖,故LIS的长度,就是最少需要的递减数列的个数使得每个元素被覆盖至少一次,而每个递减数......
  • Codeforces Round 869 (Div. 2) A-C
    目录A.Politics思路代码B.Indivisible题意思路代码C.AlmostIncreasingSubsequence题意思路代码A.Politics思路与第\(1\)个人的意见不同的人都要删除代码#include<bits/stdc++.h>usingnamespacestd;intmain(){ intT; cin>>T; while(T--) { intn,m; ci......
  • Codeforces Round 869 (Div. 2)
    Preface一把回到紫名还是很舒服的,D题手比较稳猜了点性质水过主要还是C脑抽了想了挺久才看出来是个丁真题,不然最后过了D之后30min可以看看E的由于要写学校的图论专题所以接下来一段时间的CF补题计划就要先停一停了A.Politics傻逼题,当某个人的串和第一个人有任意一个位置不同......
  • Codeforces Round 823 (Div. 2)C
    C.MinimumNotation思路:我们可以进行的操作时将一个位置的数删除然后在任意位置处添加一个比当前数大1并且小于9的数,所以我们的操作只会让一个数变大,我们统计一个最大值的后缀,贪心的考虑如果当前数的后面有比他小的数的话,我们就需要让这个小的数往前走才能使字典序变小,如果当前......
  • Codeforces Round 867 (Div. 3)
    题目链接E核心思路首先我们先考虑什么情况下是肯定不可以交换成功的:aaabc.比如像这种a的个数超过了我们整个字符串一半的长度就肯定是不可以的。然后剩下的情况肯定都是可以的。然后考虑怎么样可以使得交换次数最小呢:aaaabbccddff。我们发现这组的话我们只需要交换两......
  • codeforces div1A
    A.CircularLocalMiniMax题目翻译:给我们一个数组(循环的也就是1和n是相邻的),我们可以对数组进行任意调序,对于每个数b[i]要求满足b[i]<b[i-1]&&b[i]<b[i+1]或者满足b[i]>b[i-1]&&b[i]>b[i+1]。如果存在就输出yes并且输出构造的序列,否则输出no。思路:我们考虑......
  • Codeforces Round 869 (Div.1 & Div.2) 题解
    2A.Politics因为编号为\(1\)的人一定不会离开,那么最后留下的人一定要和编号为\(1\)的人的所有参数都一致,所以计数即可。#include<bits/stdc++.h>#include<ext/pb_ds/assoc_container.hpp>#include<ext/pb_ds/tree_policy.hpp>#include<ext/pb_ds/hash_policy.hpp>u......
  • Codeforces Round 825 (Div. 2)——B
      #include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;#defineendl"\n"inlineintgcd(inta,intb){returnb>0?gcd(b,a%b):a;}inlineintlcm(inta,intb){returna/gcd(a,b)*b;}constint......
  • Codeforces Round 855 (Div. 3)--E
    题意:给定一个k,可以任意次交换满足|i-j|=k或|i-j|=k+1的两个位置的元素很容易发现有区间内的字符是可以任意交换的,但是一个个字符考虑太混乱了(就是这样子把脑袋搞晕了),从左考虑那么(1,n-k)这个区间可以任意交换,从右考虑(k+1,n)这个区间可以任意交换那......
  • Codeforces Round 863 (Div. 3)———E
    题意:给定一个k,问由012356789组成的数字第k大的是多少链接:Problem-E-Codeforces#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;#defineendl"\n"/*思路:k代表在2没有出现4的数字中,第k大的数十进制表示由“0123456789”这九个数组......