妙啊
把每个数字看成一个点,就变成了c次幂的方法有哪些
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <string>
#include <cstring>
#include <string.h>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
using namespace std;
#define sp system("pause")
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
const ll mod = 1e9 + 7;
struct node
{
ll m[100][100];
node()
{
memset(m, 0, sizeof m);
}
node(ll x)
{
memset(m, 0, sizeof m);
for (int i = 0; i < 100; i++)m[i][i] = x;
}
};
node mulq(node &a,node &b,int n)
{
node res;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
res.m[i][j] = 0;
for (int k = 0; k < n; k++)
{
res.m[i][j] = (res.m[i][j] + a.m[i][k] * b.m[k][j]) % mod;
}
}
}
return res;
}
node pownode(node a, int n, ll c)
{
node res(1);
while (c)
{
if (c & 1)res = mulq(res, a, n);
a = mulq(a, a, n);
c >>= 1;
}
return res;
}
int gg(ll x)
{
int res = 0;
while (x)
{
if (x & 1)res++;
x >>= 1;
}
return res;
}
int main()
{
int n; ll cs;
scanf("%d%I64d", &n, &cs);
vector<ll>v;
for (int i = 0; i < n; i++)
{
ll x;
scanf("%I64d", &x);
v.push_back(x);
}
node ans;
for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)
if (gg(v[i] ^ v[j]) % 3 == 0)ans.m[i][j] = 1;
if (cs == 1)
{
printf("%d\n", n);
return 0;
}
ans = pownode(ans, n, cs-1);
ll cnt = 0;
for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)
cnt = (cnt + ans.m[i][j]) % mod;
printf("%I64d\n", cnt);
//sp;
}