NC212523. 上帝与集合的正确用法
描述
输入描述
接下来T行,每行一个正整数p,代表你需要取模的值
输出描述
T行,每行一个正整数,为答案对p取模后的值
示例1
输入:
3 2 3 6
输出:
0 1 4
C++ 解法, 执行用时: 35ms, 内存消耗: 412K, 提交时间: 2021-09-18 18:21:13
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll ph(ll x) { ll res=x,a=x; for(ll i=2;i*i<=x;i++) { if(a%i==0) { res=res/i*(i-1); while(a%i==0) a/=i; } } if(a>1) res=res/a*(a-1); return res; } ll quick_pow(ll a,ll b,ll mod) { ll ans=1; while(b) { if(b&1) ans=(ans*a)%mod; a=(a*a)%mod; b>>=1; } return ans; } ll f(ll p) { if(p==1) return 0; ll k=ph(p); return quick_pow(2,f(k)+k,p); } int main() { int T; scanf("%d",&T); while(T--) { ll p;scanf("%lld",&p); printf("%lld\n",f(p)); } return 0; }
C++(g++ 7.5.0) 解法, 执行用时: 37ms, 内存消耗: 376K, 提交时间: 2022-09-28 11:38:17
#include<cmath> #include<cstdio> typedef long long ll; int Phi(int x){ int ans=x; for(int i=2,lim=sqrt(x)+1;i<lim;i++) if(!(x%i)){ ans-=ans/i; while(!(x%i)) x/=i; } return x>1?ans-ans/x:ans; } ll pow(ll a,ll n,ll p){ ll ans=1; while(n){ if(n&1) ans=ans*a%p; a=a*a%p; n>>=1; } return ans; } ll f(int x){ if(x==1) return 0; int phi=Phi(x); return pow(2,f(phi)+phi,x); } int main(){ int kase; scanf("%d",&kase); while(kase--){ int x; scanf("%d",&x); printf("%lld\n",f(x)); } return 0; }