2^31-1 和 2147483647 的区别

更该两个数值 结束不一样
https://loj.ac/p/10064

问题相关代码,请勿粘贴截图

#include<bits/stdc++.h>
using namespace std;
const int mod=2147483647,N=1111,inf=0x3f3f3f;//mod的值
typedef long long ll;
ll a[N][N],vis[N],book[N],n,m,ans=0;
ll cnt[N];
void dijkstra()
{
    for(int i=1;i<=n;i++) vis[i]=a[1][i];
    vis[1]=0;
    book[1]=1;
    for(int i=1;i<=n;i++){
        int MIN=inf,k;
        for(int j=1;j<=n;j++){
            if(!book[j]&&vis[j]<MIN){
                MIN=vis[j];
                k=j;
            }
        }
        book[k]=1;
        for(int j=1;j<=n;j++){
            if(vis[j]>vis[k]+a[k][j])
                vis[j]=vis[k]+a[k][j];
        } 
    }
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(i==j) a[i][j]=0;
            else a[i][j]=inf;
    while(m--){
        int x,y,z;
        cin>>x>>y>>z;
        if(a[x][y]>z)
            a[x][y]=a[y][x]=z;
    }
    memset(book,0,sizeof(book));
    dijkstra();
    memset(cnt,0,sizeof(cnt));
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(i!=j&&vis[j]==vis[i]+a[i][j])
                cnt[j]++;
    ans=1;
    for(int i=1;i<=n;i++)
        if(cnt[i]){
            ans*=cnt[i];
            ans%=mod;
        }
    cout<<ans<<endl;
 } 
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果

C++默认用int类型计算,而(1<<31)-1按有符号整型计算是溢出的,C++对有符号整型溢出的行为没有定义,因此其行为依赖于编译器实现。
https://en.cppreference.com/w/cpp/language/operator_arithmetic#Overflows

When signed integer arithmetic operation overflows (the result does not fit in the result type), the behavior is undefined,

如果你直接写成 const int mod=2^31-1,那mod是28,因为c++中^是异或运算符而不是求幂。写成const int mod=pow(2,31)-1;就和2147483647一样了。