C++拉格朗日插值法

洛谷原题:https://www.luogu.com.cn/problem/P4781
有几个问题,第28行为什么需要pow(P-2,b)%P?b不是作为拉格朗日插值法基函数的分母吗,这么写的意义是什么?
以及该如何修改才能通过样例?修改了一晚上无果,谢谢。

我的代码(改题解的代码改的):

#include<cstdio>
#include<iostream>
#include<algorithm>
#define P 998244353
using namespace std;

int n,k;
int a,b,ans;
int x[2005],y[2005];

int pow(int k,int n){
    int r=1;
    for(;k;k>>=1,n=n*n%P)if(k&1)r=r*n%P;
    return r;
}

int main(){
    cin>>n>>k;
    for(int i=1;i<=n;i++)cin>>x[i]>>y[i];
    for(int i=1;i<=n;i++){
        a=y[i]%P ;
        b=1;
        for(int j=1;j<=n;j++){
            if(i==j)continue;
            a=a*(k-x[j])%P;
            b=b*(x[i]-x[j])%P;
        }
        ans=(ans+a*pow(P-2,b)%P)%P;
    }
    cout<<(ans+P)%P;
    return 0;
}

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

以下是一个可能的 C 语言程序,可以实现输入一个 4 位数 n,按从小到大的顺序寻找不大于 n 的满足前两位数字之和与后两位数字之和相等的数,并输出结果。





#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);

    int count = 0; // 满足条件的数的个数
    for (int num = 1000; num <= n; num++) {
        int first_two = (num / 1000) + ((num / 100) % 10); // 前两位数字之和
        int last_two = ((num / 10) % 10) + (num % 10); // 后两位数字之和
        if (first_two == last_two) {
            printf("%d ", num);
            count++;
        }
    }

    if (count == 0) {
        printf("0\n");
    } else {
        printf("\n%d\n", count);
    }

    return 0;
}




程序的思路是从 1000 开始,一直到不大于 n 的所有 4 位数中,判断前两位数字之和与后两位数字之和是否相等,如果相等,则输出这个数,并且计数器加一。最后判断计数器的值是否为 0,如果为 0 则输出 0,否则输出计数器的值。注意,在输出满足条件的数字时,数字之间需要用空格隔开。