import java.util.Scanner;
public class Main {
public static void main(String[] arg) {
Scanner scanner = new Scanner(System.in);
// todo
}
}
NC233107. Little Pony and Elements of Harmony
描述
输入描述
第一行三个整数![]()
。
接下来一行![]()
个整数
![]()
。
接下来一行个整数
![]()
输出描述
输出行,第
行包含一个整数表示
对
取模的结果。
示例1
输入:
2 2 10000 4 1 2 3 0 1 0
输出:
14 6 6 14
C++(g++ 7.5.0) 解法, 执行用时: 3970ms, 内存消耗: 26976K, 提交时间: 2022-08-17 09:54:57
#include<bits/stdc++.h>const int N = (1 << 20) | 1;using namespace std;#define int long longint n, m, t, p, b[N], a[N], mod, e[N];void XOR(int *f, int type) {for(int mid = 1; mid < n; mid <<= 1)for(int len = mid << 1, j = 0; j < n; j += len)for(int k = 0; k < mid; k ++) {int x = f[j + k] % mod, y = f[j + k + mid] % mod;f[j + k] = (x + y) % mod;f[j + k + mid] = (x - y + mod) % mod;}if(type == -1) {for(int i = 0; i < n; i ++) f[i] = f[i] / n;}}int mul(int a, int b, int mod) {return (a * b - (int)((long double)a / mod * b) * mod + mod) % mod ;}signed main() {ios::sync_with_stdio(false);cin.tie(0);cin >> m >> t >> p;n = 1 << m; mod = p * n;for(int i = 0; i < n; i ++) cin >> e[i];for(int i = 0; i <= m; i ++)cin >> b[i];for(int i = 0; i < n; i ++)a[i] = b[__builtin_popcount(i)];XOR(e, 1); XOR(a, 1);while(t) {if(t & 1) {for(int i = 0; i < n; i ++)e[i] = mul(e[i], a[i], mod);}t >>= 1;for(int i = 0; i < n; i ++)a[i] = mul(a[i], a[i], mod);}XOR(e, -1);for(int i = 0; i < n; i ++)cout << e[i] << "\n";}
C++ 解法, 执行用时: 4561ms, 内存消耗: 35152K, 提交时间: 2022-03-04 20:24:10
#include<bits/stdc++.h>#define ll long long#define PII pair<int,int>using namespace std;template<class T>inline void read(T &x){x=0; int sign=1; char c;do{ c=getchar(); if(c=='-') sign=-1; }while(!isdigit(c));do{ x=x*10+c-'0',c=getchar();}while(isdigit(c));x*=sign;}const int N=2e6+50;ll mod;inline ll qpow(ll a,ll b){ll ans=1LL;for(;b;b>>=1,a=(__int128)a*a%mod) if(b&1) ans=(__int128)ans*a%mod;return ans;}int n,m;void FWT(ll *a,int sign){for(int k=n,len=1<<(n-1);k>=1;--k,len>>=1)for(int i=0;i<m;i+=1<<k)for(int j=i;j<i+len;++j)a[j]=(a[j]+a[j+len])%mod,a[j+len]=(a[j]+mod-a[j+len]+mod-a[j+len])%mod;}ll t,a[N],b[N],c[N];int main(){read(n),read(t),read(mod);m=1<<n,mod*=m;for(int i=0;i<m;++i) read(a[i]),a[i]%=mod;for(int i=0;i<=n;++i) read(c[i]),c[i]%=mod;for(int i=1;i<m;++i) b[i]=b[i>>1]+(i&1);for(int i=0;i<m;++i) b[i]=c[b[i]];FWT(a,1),FWT(b,1);for(int i=0;i<m;++i) c[i]=(__int128)qpow(b[i],t)*a[i]%mod;FWT(c,1);for(int i=0;i<m;++i) printf("%lld\n",c[i]/m);return 0;}