code force 1228C

Posted caibingxu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了code force 1228C相关的知识,希望对你有一定的参考价值。

算是一题普通数论+思维题吧。

大概很多人是被题意绕晕了。

 

思路:

   首先常规操作求出X的质因子。

   然后题目要求的是,X的每个质因子p,在g(i,p)的连乘。i∈[1,n];

   我们转换下思维,不求每一个g(i,p)中最终是哪些 p的幂次,而是反求 每个p的幂次对结果的贡献。

   显而易见,p^k在1~n的出现的次数就是  [n/(p^k)].

   这样枚举所有质因子,计算中再利用快速幂取模便可以得到答案

//#pragma comment(linker, "/STACK:1024000000,1024000000")
//#pragma GCC optimize(2)
#include <bits/stdc++.h>

using namespace std;
typedef double dou;
typedef long long ll;
typedef pair<int, int> pii;
typedef map<int, int> mii;

#define pai acos(-1.0)
#define M 200007
#define inf 0x3f3f3f3f
#define mod 1000000007
#define IN inline
#define W(a) while(a)
#define lowbit(a) a&(-a)
#define left k<<1
#define right k<<1|1
#define lson L, mid, left
#define rson mid + 1, R, right
#define ms(a,b) memset(a,b,sizeof(a))
#define Abs(a) (a ^ (a >> 31)) - (a >> 31)
#define random(a,b) (rand()%(b+1-a)+a)
#define false_stdio ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)

ll x, n;
ll ans = 1;
vector<ll>num;

void init(ll tmp) 
    for (ll i = 2; i * i <= tmp; i++) 
        if (tmp % i == 0) 
            num.push_back(i);
            W(tmp % i == 0)tmp /= i;
        
    
    if (tmp != 1)num.push_back(tmp);


ll Pow(ll base, ll sup) 
    ll sum = 1;
    W(sup) 
        if (sup & 1)sum = (sum * base) % mod;
        sup >>= 1;
        base = (base * base) % mod;
    
    return sum % mod;


int main() 
    false_stdio;
    cin >> x >> n;
    init(x);
    for (auto p : num) 
        ll tmp = 1;
        W(tmp <= n / p) //条件应该理解为  tmp*p<=n,而n%p==0,所以可以利用除法防止爆精度
            tmp *= p;
            ans = (ans * Pow(p, n / tmp)) % mod;
        
    
    cout << ans << endl;
    return 0;

 

以上是关于code force 1228C的主要内容,如果未能解决你的问题,请参考以下文章

code forces 990C

code forces 994B

code forces 994C

code forces 979C

code forces 999CAlphabetic Removals

code force 893D Credit Card