POJ 2154 Color 【polya+dfs】

本文探讨了如何通过优化算法和数据结构来提高代码效率,详细介绍了排序算法、动态规划、哈希算法等核心概念,并通过实例展示了它们在实际编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看来有必要变得更加强大啊......... 141MS

#include<cstdio> #include<vector> #include<cmath> using namespace std; const int maxn=1<<15; vector<pair<int,int> >v; int vis[maxn],prime[maxn]; int n,mod,cnt=0; void init() { for(int i=2;i<maxn;i++) if(!vis[i]) { prime[cnt++]=i; for(int j=i*i;j<maxn;j+=i) vis[j]=1; } } int phi(int x) { int a=x; for(int i=0;i<cnt;i++) { int &p=prime[i]; if(p*p>x) break; if(x%p==0) { while(x%p==0) x/=p; a-=a/p; } } if(x>1) a-=a/x; return a%mod; } int pow(int x) { int ans=1,base=n%mod; while(x) { if(x&1) ans=ans*base%mod; base=base*base%mod;x>>=1; } return ans; } int dfs(int pos,int cur) { int ans=phi(n/cur)*pow(cur-1)%mod; while(pos<v.size()) { int nxt=cur; for(int i=0;i<v[pos].second;i++) { nxt*=v[pos].first; ans=(ans+dfs(pos+1,nxt))%mod; } pos++; } return ans; } void read(int &d) { char ch; while(ch=getchar(),ch<48||ch>57);d=ch-48; while(ch=getchar(),ch>47&&ch<58) d=d*10+ch-48; } void write(int d) { if(d==0){puts("0");return;} char str[6];str[5]=0;int i; for(i=4;d;i--) str[i]=d%10+48,d/=10; puts(str+i+1); } int main() { int t;init(); read(t); while(t--) { read(n),read(mod); v.clear();int x=n; for(int i=0;i<cnt;i++) { int num,&p=prime[i]; if(p*p>x) break; if(x%p) continue; for(num=0;x%p==0;num++) x/=p; v.push_back(make_pair(p,num)); } if(x>1) v.push_back(make_pair(x,1)); write(dfs(0,1)); } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值