UVA - 12298 Super Poker II NTT

UVA - 12298 Super Poker II NTT

链接

Vjudge

思路

暴力开个桶,然后统计,不过会T,用ntt或者fft,ntt用个大模数就行了,百度搜索"NTT大模数"。

错误

我也不知道,改着改着自己就A了

思路

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1e7+7,mod=39582418599937LL;
char s;
bool vis[N];
ll A[4][N],len[4],r[N];
ll read() {
    ll x=0,f=1;s=getchar();
    for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
    for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
    return x*f;
}
ll mul(ll u,ll v){return ((u*v-(ll)((long double)u/mod*v+1e-8)*mod)%mod+mod)%mod;}
ll q_pow(ll a,ll b) {
    ll ans=1;
    while(b) {
        if(b&1) ans=mul(ans,a);
        a=mul(a,a);
        b>>=1;
    }
    return ans;
}
void ntt(ll *a,ll limit,ll type) {
    for(ll i=0;i<=limit;++i)
        if(i<r[i]) swap(a[i],a[r[i]]);
    for(ll mid=1;mid<limit;mid<<=1) {
        ll Wn=q_pow(5,(mod-1)/(mid<<1));
        for(ll i=0;i<limit;i+=(mid<<1)) {
            for(ll j=0,w=1;j<mid;++j,w=mul(w,Wn)) {
                ll x=a[i+j],y=mul(w,a[i+j+mid]);
                a[i+j]=(x+y)%mod;
                a[i+j+mid]=(x+mod-y)%mod;
            }
        }
    }
    if(type==-1) {
        reverse(&a[1],&a[limit]);
        ll inv=q_pow(limit,mod-2);
        for(ll i=0;i<=limit;++i) a[i]=mul(a[i],inv);
    }
}
void Euler(ll b) {
    for(ll i=2;i<=b;++i)  {
        if(!vis[i]) {
            for(ll j=i+i;j<=b;j+=i) 
                vis[j]=1;
        }
    }
}       
int main() {
    Euler(50000);
    while(233) {
        ll a=read(),b=read(),c=read();
        if(!a&&!b&&!c) break;
        memset(A,0,sizeof(A));
        ll limit=1,l=0;
        for(ll i=2;i<=b;++i) A[0][i]=A[1][i]=A[2][i]=A[3][i]=vis[i];
        for(ll i=1;i<=c;++i) {
            ll x=read();
            if(s=='S') A[0][x]=0;
            else if(s=='H') A[1][x]=0;
            else if(s=='C') A[2][x]=0;          
            else A[3][x]=0;
        }
        while(limit<=4LL*b) limit<<=1,l++;
        for(ll i=0;i<=limit;++i)
            r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
        ntt(A[0],limit,1),ntt(A[1],limit,1),ntt(A[2],limit,1),ntt(A[3],limit,1);
        for(ll i=0;i<=limit;++i) A[0][i]=mul(mul(A[0][i],A[1][i]),mul(A[2][i],A[3][i]));
        ntt(A[0],limit,-1);
        for(ll i=a;i<=b;++i) printf("%lld\n",A[0][i]);
        puts("");
    }
    return 0;
}
全部评论

相关推荐

行云流水1971:这份实习简历的优化建议: 结构清晰化:拆分 “校园经历”“实习经历” 板块(当前内容混杂),按 “实习→校园→技能” 逻辑排版,求职意向明确为具体岗位(如 “市场 / 运营实习生”)。 经历具象化:现有描述偏流程,需补充 “动作 + 数据”,比如校园活动 “负责宣传” 可加 “运营公众号发布 5 篇推文,阅读量超 2000+,带动 300 + 人参与”;实习内容补充 “协助完成 XX 任务,效率提升 X%”。 岗位匹配度:锚定目标岗位能力,比如申请运营岗,突出 “内容编辑、活动执行” 相关动作;申请市场岗,强化 “资源对接、数据统计” 细节。 信息精简:删减冗余表述(如重复的 “负责”),用短句分点,比如 “策划校园招聘会:联系 10 + 企业,组织 200 + 学生参与,到场率达 85%”。 技能落地:将 “Office、PS” 绑定经历,比如 “用 Excel 整理活动数据,输出 3 份分析表;用 PS 设计 2 张活动海报”,避免技能单独罗列。 优化后需强化 “经历 - 能力 - 岗位需求” 的关联,让实习 / 校园经历的价值更直观。 若需要进一步优化服务,私信
实习,投递多份简历没人回...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务